2012-01-27 13 views
8

मैंने केकेपीएचपी 1.3 के साथ काम किया है, लेकिन यह केकपीएचपी 2.0 और PHP अपवादों में मेरा पहला प्रयास है, इसलिए मेरा प्रश्न शब्दशः लगता है तो मेरे साथ सहन करें।केकपीएचपी 2.0 - पहलेफिल्टर() केकरर कंट्रोलर पर नहीं चल रहा है?

मेरे AppController के beforeFilter() में मैंने अपने दृश्य टेम्पलेट में उपयोग के लिए $this->set() के माध्यम से कुछ चर सेट किए हैं।

public function beforeFilter() { 
    parent::beforeFilter(); 
    if (userDeniedAccess()) { 
    throw new ForbiddenException(); 
    } 
} 

जहां काल्पनिक समारोह userDeniedAccess() मेरे प्राधिकरण के चेकों समाहित:

मेरी UsersController कोड रहा है कि इस तरह मोटे तौर पर लग रहा है में

यह सब ठीक काम करता है, और जब मुझे उम्मीद है तो मुझे 403 त्रुटि मिलती है। हालांकि, जब अपवाद फेंक दिया जाता है, तो दृश्य चर जो AppController::beforeFilter() में सेट किए गए थे अब सेट नहीं होते हैं, जिसके परिणामस्वरूप मेरे दृश्य टेम्पलेट से त्रुटियां होती हैं। जब अपवाद फेंक दिया गया है, चर सही ढंग से सेट हैं।

यदि मुझे जरूरी है तो मैं लापता चर के आसपास कोड कर सकता हूं, लेकिन मैं वास्तव में जानना चाहता हूं कि इस व्यवहार का कारण क्या है। मेरे UsersController और CakeErrorController दोनों AppController का विस्तार करें। स्वाभाविक रूप से, मुझे उम्मीद है कि जब अपवाद फेंक दिया जाता है और CakeErrorController तत्काल होता है, तो यह मेरे लिए एक ही दृश्य चर उत्पन्न करेगा।

हालांकि, ऐसा लगता है कि Controller::startupProcess() विधि (जिसमें beforeFilter() पर कॉल शामिल है) को कभी भी CakeErrorController पर कॉल नहीं किया जाता है। जैसा कि मैं इसे समझता हूं, यह नियमित अनुरोधों के लिए प्रेषक द्वारा किया जाता है, लेकिन त्रुटि नियंत्रक का जीवन चक्र अलग होता है।

मैंने केकपीएचपी 1.3 में समान व्यवहार के विवरण (like this one) को देखा है, लेकिन निश्चित रूप से केकेपीएचपी के त्रुटि हैंडलिंग कोड को 2.0 में पूरी तरह से ओवरहाल किया गया है।

तो या तो:

  1. यह CakePHP के डिफ़ॉल्ट अपवाद हैंडलिंग में एक बग है,
  2. व्यवहार के रूप में इरादा और मैं बस यह समझ में नहीं आता, या
  3. मैं पागल हो जा रहा हूँ है।

मुझे पता है कि आप मामले 3 में मदद नहीं कर सकते हैं, लेकिन यदि पहले दो में से कोई भी लागू होता है, तो मैं किसी ऐसे व्यक्ति से इनपुट की सराहना करता हूं जो मुझसे ज्यादा जानता है।

धन्यवाद!

संपादित करें:beforeRender() में दृश्य चर सेट करना मेरी समस्या का समाधान करता है। हालांकि, मुझे अभी भी आश्चर्य है कि क्या यह जानबूझकर है कि beforeFilter() को कभी भी CakeErrorController पर कॉल नहीं किया जाता है।

+1

+1 "मैं पागल हो सकता हूं" आत्म-निदान। –

उत्तर

4

beforeRender() कॉलबैक में $this->set() पर कॉल डालें। इस तरह, जब आप अपवाद फेंकते हैं तब भी वे हमेशा सेट किए जाएंगे।

मुझे कुछ कस्टम लेआउट वैरिएबल के साथ एक ही समस्या थी, क्योंकि डीबगकिट के साथ मेरा पृष्ठ किसी भी प्रकार की त्रुटि होने पर अविकसित चर चेतावनियों से भरा होगा। beforeRender() का उपयोग करके इसे ठीक किया गया।

+0

+1 एक अंतर्दृष्टिपूर्ण उत्तर के लिए +1 - लेकिन मुझे यकीन नहीं है कि यह मेरे लिए काम करेगा, क्योंकि पहले से ही रेंडर() 'क्रिया तर्क के बाद चलता है। चूंकि मैं प्राधिकरण जांच कर रहा हूं, इसलिए मैं विफल नहीं होने पर क्रिया तर्क चलाने के लिए नहीं चाहता हूं। – eaj

+0

दूसरे विचार पर, यह समझ में नहीं आता है। बेशक मैं अपने अपवाद को 'पहले फ़िल्टर()' में फेंक सकता हूं और 'पहले रेंडर() 'में दृश्य चर सेट कर सकता हूं। मैंने यह जवाब स्वीकार कर लिया है क्योंकि यह मेरी तत्काल समस्या हल करता है, लेकिन मुझे अभी भी यह जानना अच्छा लगेगा कि यह एक बग है कि पहले त्रुटि नियंत्रक पर पहले Filter() 'नहीं कहा जाता है। – eaj

3

आप इसे ऐप/कंट्रोलर/ पर कॉपी करके केकईररकंट्रोलर.एफ़पी को ओवरराइट कर सकते हैं और फिर कंट्रोलर में पहले माता-पिता :: पहले फ़िल्टर() जोड़ सकते हैं।

+0

धन्यवाद, यह निश्चित रूप से एक उपयोगी विकल्प है। हालांकि, यह थोड़ा हैकिश महसूस करता है। इस बिंदु पर मुझे अपना कोड मिल गया है जो इसे करने की ज़रूरत है। मैं अभी भी समझना चाहूंगा कि क्यों अपवाद-हैंडलिंग प्रक्रिया 'केकईरर कंट्रोलर' पर 'स्टार्टअप प्रोसेस() 'को कॉल नहीं करती है, वैसे ही प्रेषक इसे अन्य नियंत्रकों पर कॉल करता है। – eaj

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