2012-03-08 22 views
30

मैंने पढ़ा है कि AppError क्लास पिछली संगतता के लिए है और इसके बजाय अपवादों का उपयोग किया जाना चाहिए। 404 त्रुटियों, या पूरी तरह से कस्टम त्रुटियों जैसी चीजों के लिए कस्टम त्रुटि पृष्ठ बनाने के बारे में कोई कैसे जाता है?केकपीएचपी 2.0 - कस्टम त्रुटि पेज कैसे बनाएं?

उत्तर

45

इस प्रयास करें:

/app/Config/core.php

अपवाद एक AppExceptionRender के रूप में स्थापित करने की आवश्यकता पर प्रस्तुत करना। उदाहरण:

Configure::write('Exception', array(
     'handler' => 'ErrorHandler::handleException', 
     'renderer' => 'AppExceptionRenderer', 
     'log' => true 
)); 

/app/Controller/ErrorsController.php

class ErrorsController extends AppController { 
    public $name = 'Errors'; 

    public function beforeFilter() { 
     parent::beforeFilter(); 
     $this->Auth->allow('error404'); 
    } 

    public function error404() { 
     //$this->layout = 'default'; 
    } 
} 

/app/Lib/Error/AppExceptionRenderer.php

App::uses('ExceptionRenderer', 'Error'); 

class AppExceptionRenderer extends ExceptionRenderer { 

    public function notFound($error) { 
     $this->controller->redirect(array('controller' => 'errors', 'action' => 'error404')); 
    } 
} 

/ऐप्स/देखें/त्रुटियाँ/error404। सीटीपी

<div class="inner404"> 
    <h2>404 Error - Page Not Found</h2> 
</div> 

इसे डालने की आवश्यकता है जहां आपको चाहिए: throw new NotFoundException();

+2

इसके अलावा, इसे काम करने के लिए, आपको core.php फ़ाइल में अपवाद रेंडरर को 'AppExceptionRenderer' के रूप में निर्दिष्ट करने की आवश्यकता है। –

+0

धन्यवाद @ जोनाथन कैरन्स, मैं उस नवाचार का उल्लेख करना भूल गया। कोड उदाहरण में जोड़ा गया। –

+0

धन्यवाद, यह काम करता है। यदि आप केवल अपने पृष्ठ की सामग्री को कस्टमाइज़ करना चाहते हैं और कस्टम तर्क की आवश्यकता नहीं है, तो यह निर्दिष्ट एंटोस नियंत्रक के निर्माण को छोड़ने के लिए पर्याप्त है और इसके बजाय आपके AppExceptionRenderer में पेज-कंट्रोलर पर रीडायरेक्ट करना पर्याप्त है। – bfncs

0

आप CustomErrorPages या Exeptions बना सकते हैं बस अपनी त्रुटि के class बनाकर। इस वर्ग को CakeExeption का विस्तार करने की आवश्यकता है। फिर अपने exeptionlogic और अपने सेट का निर्माण करें। अब आप केवल throw new <YourExeptionClass>() कर सकते हैं और यह एक त्रुटि प्रदर्शित करेगा।

प्रलेखन: CakeExceptions

+1

लेकिन मैं उस त्रुटि को 404 के लिए कब फेंक दूंगा? मेरा मतलब है कि अब ऐप 404 पेज को कैसे अनुकूलित करता है? – BadHorsie

38

404-त्रुटि पृष्ठ की सामग्री को कस्टमाइज़ करने के लिए और कस्टम तर्क की आवश्यकता नहीं है, बस app/View/Errors/error400.ctp की सामग्री संपादित करें।

ऐसा लगता है कि यह कहीं भी ठीक से प्रलेखित नहीं किया गया है।

+0

धन्यवाद आप सर को लोड करते हैं !! –

+0

इस त्रुटि पृष्ठ को लोड करने के लिए अपवाद फेंकना पर्याप्त है - 'नया नोटफॉउंड अपवाद();' –

+1

फेंक दें आपको अधिक अपवॉट्स चाहिए .. मेरा ले लो;) – Karma

4

नाम 404 या कुछ भी साथ लेआउट बनाएं और एप्लिकेशन नियंत्रक

function _setErrorLayout() { 
    if ($this->name == 'CakeError') { 
     $this->layout = '404'; 
    } 
} 
function beforeRender() { 
    $this->_setErrorLayout(); 
} 
6

में उपयोग आप केवल डिफ़ॉल्ट की बजाय किसी दूसरे लेआउट का उपयोग करने, बस अपने error400.ctp अंदर $this->layout = 'your_error_layout'; जोड़ने (देख रहे हैं या कोई अन्य त्रुटि पृष्ठ जिसे आप व्यू/त्रुटियों के अंतर्गत बनाते हैं)।

2

स्वीकृत उत्तर सबसे अच्छा विकल्प नहीं है क्योंकि वे आपके ब्राउज़र के यूआरएल को http://example.com.br/error/error404 पर रीडायरेक्ट करते हैं और उपयोगकर्ता इस त्रुटि को उत्पन्न करने के लिए इनपुट किए गए पृष्ठ का पालन नहीं कर सकता है।

बेहतर तरीका इस स्थिति को संभालने के लिए View/Errors/error400.ctp पर संपादित फ़ाइल है, इसलिए जब आप इनपुट http:example.com/crazy-wrong-url की तरह एक नहीं मिला यूआरएल, ब्राउज़र इस यूआरएल रख लेकिन error400.ctp फ़ाइल जिसे आप संपादित की सामग्री प्रस्तुत करना होगा।

आप लेआउट उस दृश्य आप अपने ध्यान में रखते हुए इस टाइप कर सकते हैं रेंडर किया जाएगा बदल चाहते हैं <?php $this->layout = 'error'; ?>

0

आज कि संभव है (CakePHP 2.x में $error->getCode() का उपयोग कर सीटीपी फ़ाइल में excpetion कोड प्राप्त करने के की खोज की थी, कम से कम)।

$error थे केक अपवाद वस्तु डालता है ...

अब आप इस मान के आधार पर if/else सशर्त ब्लॉक के साथ अपने दृश्य की सामग्री को बदलने में सक्षम होना चाहिए।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^