2012-10-24 25 views
0

我有一個用Laravel PHP框架編寫的應用程序。我的主應用程序監聽404和500事件。如何使用laravel捆綁包以不同方式響應404/500錯誤?

Event::listen('404', function() 
{ 
    return Response::error('404'); 
}); 

Event::listen('500', function() 
{ 
    return Response::error('500'); 
}); 

這顯示我的自定義錯誤頁面的用戶。但是現在,我還構建了一個API,它生活在一個名爲api的包中。這個API將通過Ajax使用,所以我想以不同的方式處理錯誤。所以我加了這些事件的API捆綁的routes.php文件:

Event::listen('404', function() 
{ 
    return Response::json(array('status' => 'error', 'message' => 'API endpoint not found.')); 
}); 

Event::listen('500', function() 
{ 
    return Response::json(array('status' => 'error', 'message' => 'Internal server error')); 
}); 

不幸的是,這並不工作,但仍顯示HTML錯誤頁面。如何根據API或主應用程序對404/500錯誤做出不同的響應?

謝謝!

+0

斯蒂芬在那裏有一個體面的答案,如果沒有內置方法找不到,我會去。問題:你的api包是否指定''處理'bundles.php'中的'api'路由? (可能是一個愚蠢的問題...) –

+0

是的,我指定了。 – EsTeGe

回答

1

您是否嘗試覆蓋您的包中的主應用程序偵聽器?這應該在您的包被調用時將它們作爲偵聽器移除,並僅保留事件的包監聽器。

您可以使用Event::override()方法而不是偵聽方法來覆蓋事件。

Event::override('404', function() 
{ 
    return Response::json(array('status' => 'error', 'message' => 'API endpoint not found.')); 
}); 
+0

太好了!這是訣竅。我不知道重寫方法。文檔沒有提到它。 – EsTeGe

+0

嗨,我能夠得到這404工作,但不是500的工作:http://stackoverflow.com/questions/14276741/custom-error-500-page-not-displaying-using-eventoverride-laravel你能得到它也爲500個活動工作? – user1746582

0

你的API可以直接返回像這樣的迴應:

return Response::make(json_encode($array), 404);

當然,你可以封裝成自己$yourApiController->error($data, $code)方法這一點。

+0

您建議的方法無法處理未知的API端點,例如如果我要求'/ API/something_that_not_exists',它會簡單地拋出默認404 – EsTeGe

+0

你可以聽使用您的API基本控制器這種方法未知端點:'公共職能__call($方法,$參數) \t {\t \t \t $ this-> error($ data,404); \t}' –

1

在routes.php文件變化的事件監聽器:

Event::listen('404', function() 
{ 
    if (URI::segment(1) == 'api') { 
      return Response::json(array('status' => 'error', 'message' => 'API endpoint not found.'),404); 
    } 

    return Response::error('404'); 
}); 

您可能需要在添加類似的東西在你的基地控制器__call包羅萬象。