2012-06-20 30 views
16

मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसमें एक आरईएसटी एपीआई घटक शामिल है। मेरे पास सभी आरईएसटी एपीआई कॉलों को संभालने के लिए समर्पित नियंत्रक है।वाईआई: किसी विशिष्ट नियंत्रक के लिए सभी अपवादों को पकड़ना

क्या उस विशिष्ट नियंत्रक के लिए सभी अपवादों को पकड़ने का कोई तरीका है ताकि मैं शेष अपॉइंटर्स के नियंत्रकों की तुलना में उन अपवादों के लिए एक अलग कार्रवाई कर सकूं?

आईई: मैं या तो एक एक्सएमएल/जेएसओएन स्वरूपित एपीआई प्रतिक्रिया के साथ प्रतिक्रिया देना चाहता हूं जिसमें डिफ़ॉल्ट सिस्टम व्यू/स्टैक ट्रेस (जो कि एपीआई संदर्भ में वास्तव में उपयोगी नहीं है) के बजाय अपवाद संदेश शामिल है। नियंत्रक में प्रत्येक विधि कॉल को अपने स्वयं के प्रयास/पकड़ में लपेटना पसंद नहीं करेंगे।

अग्रिम में किसी भी सलाह के लिए धन्यवाद।

उत्तर

36

आप पूरी तरह बाईपास Yii के डिफ़ॉल्ट त्रुटि तंत्र को प्रदर्शित कर सकते हैं वर्णित कर के कई तरीके हैं।

उदाहरण:

class ApiController extends CController 
{ 
    public function init() 
    { 
    parent::init(); 

    Yii::app()->attachEventHandler('onError',array($this,'handleError')); 
    Yii::app()->attachEventHandler('onException',array($this,'handleError')); 
    } 

    public function handleError(CEvent $event) 
    {   
    if ($event instanceof CExceptionEvent) 
    { 
     // handle exception 
     // ... 
    } 
    elseif($event instanceof CErrorEvent) 
    { 
     // handle error 
     // ... 
    } 

    $event->handled = TRUE; 
    } 

    // ... 
} 
+0

धन्यवाद, मैं चीजों के सभी तरह की कोशिश की है, लेकिन अपने समाधान अब तक का सबसे अच्छा तरीका है एपीआई नियंत्रक जैसी चीजों के लिए त्रुटि/अपवाद संचालक ओवरराइड करने के लिए है। –

3

आप अपने स्वयं के actionError() फ़ंक्शन प्रति नियंत्रक लिख सकते हैं। वहाँ कि onError और onException घटना श्रोताओं पंजीकरण से here

9

मैं नियंत्रक में घटनाओं संलग्न करने के लिए सक्षम नहीं था, और मैं परिभाषा CWebApplication वर्ग द्वारा यह किया:

class WebApplication extends CWebApplication 
{ 
protected function init() 
{ 
    parent::init(); 

    Yii::app()->attachEventHandler('onError',array($this, 'handleApiError')); 
    Yii::app()->attachEventHandler('onException',array($this, 'handleApiError')); 
} 

/** 
* Error handler 
* @param CEvent $event 
*/ 
public function handleApiError(CEvent $event) 
{ 
    $statusCode = 500; 

    if($event instanceof CExceptionEvent) 
    { 
     $statusCode = $event->exception->statusCode; 
     $body = array(
      'code' => $event->exception->getCode(), 
      'message' => $event->exception->getMessage(), 
      'file' => YII_DEBUG ? $event->exception->getFile() : '*', 
      'line' => YII_DEBUG ? $event->exception->getLine() : '*' 
     ); 
    } 
    else 
    { 
     $body = array(
      'code' => $event->code, 
      'message' => $event->message, 
      'file' => YII_DEBUG ? $event->file : '*', 
      'line' => YII_DEBUG ? $event->line : '*' 
     ); 
    } 

    $event->handled = true; 

    ApiHelper::instance()->sendResponse($statusCode, $body); 
} 
} 

index.php में:

require_once(dirname(__FILE__) . '/protected/components/WebApplication.php'); 
Yii::createApplication('WebApplication', $config)->run(); 
0

मैं एक एपीआई के लिए निम्न बेस नियंत्रक का उपयोग कर रहा हूं, यह स्टेटलेस एपीआई नहीं है, आपको दिमाग है, लेकिन यह बस भी सेवा कर सकता है।

वर्ग BaseJSONController फैली CController {

 public $data = array(); 

     public $layout; 

     public function filters() 
     { 
       return array('mainLoop'); 
     } 

     /** 
     * it all starts here 
     * @param unknown_type $filterChain 
     */ 
     public function filterMainLoop($filterChain){ 
       $this->data['Success'] = true; 
       $this->data['ReturnMessage'] = ""; 
       $this->data['ReturnCode'] = 0; 
       try{ 
         $filterChain->run(); 

       }catch (Exception $e){ 
         $this->data['Success'] = false; 
         $this->data['ReturnMessage'] = $e->getMessage(); 
         $this->data['ReturnCode'] = $e->getCode(); 
       } 

       echo json_encode($this->data); 
     } 
} 

तुम भी dbException को पकड़ने और उन ईमेल के रूप में वे कुछ हद तक महत्वपूर्ण रहे हैं और कोड/db डिजाइन में मूल समस्या को दिखा सकते हैं सकता है।

0

अपने नियंत्रक को यह करें:

Yii::app()->setComponents(array(
    'errorHandler'=>array(
     'errorAction'=>'error/error' 
    ) 
)); 
संबंधित मुद्दे