2015-03-05 4 views
2

У меня есть приложение, в котором мои контроллеры разбиты на определенные группы (API, CMS и front-end), это уже настроено с использованием групп маршрутизаторов. Мой вопрос заключается в том, как создать индивидуальную обработку ошибок для каждой группы.Laravel 5 обработчик исключения контроллера

Например, когда возникает исключение в любом действии контроллера API, я хотел бы отправить обратно json с кодом ошибки и сообщением, исключение в CMS выдаст подробную страницу с ошибкой, а исключение на лицевой стороне будет отправьте пользователя на общую страницу ошибок 404 или 500 (в зависимости от ситуации).

Я знаю, как это сделать вручную в каждом действии контроллера, но это может стать очень повторяющимся. В идеале я хотел бы создать один обработчик для каждого и автоматически использовать его по всем направлениям.

Я также знаю класс App \ Exceptions \ Handler, но если какая-либо из групп контроллеров может возвращать исключение ModelNotFoundException, например, как я могу отличить, откуда возникло исключение?

Есть ли место, где этот обработчик исключений может быть вставлен?

+0

У меня очень похожая версия этой проблемы, у меня есть контроллер, полный методов XML и JSON-возврата. Мне нужно уловить все ошибки и отобразить код ошибки и сообщение об ошибке в JSON или XML в зависимости от действия контроллера. На самом деле изо всех сил пытаюсь найти способ сделать это чисто. –

ответ

3

Если вы идете в app\Exceptions\Handler.php файл (который вы упомянули), вы можете сделать это, что хотите.

Вы могли бы, например, определить свои render функции таким образом:

public function render($request, Exception $e) 
{ 
    $trace = $e->getTraceAsString(); 
    if ($e instanceof ModelNotFoundException 
     && mb_strpos($trace, 'app\Http\Controllers\WelcomeController') 
    ) { 
     return response()->json('Exception ' . $e->getMessage()); 
    } elseif ($e instanceof ModelNotFoundException) { 
     return "General model not found"; 
    } 

    return parent::render($request, $e); 
} 

и добавить к импорту use Illuminate\Database\Eloquent\ModelNotFoundException;

и теперь, если вы бросаете ModelNotFoundException в вашем WelcomeController или вы, например, запустить другой метод класса из ваш WelcomeController и этот метод будет кидать ModelNotFoundException, вы можете отслеживать его и возвращать ответ json. В других случаях, если исключение будет экземпляром ModelNotFoundException, вы можете сделать свое исключение другим способом, а во всех остальных случаях вы можете использовать стандартный метод исключения для рендеринга.

Таким образом, вам не нужно определять что-либо в вашем контроллере, вы можете сделать это только в Handler, и это сложнее, вы можете создавать отдельные методы или создавать новые классы для обработки определенных исключений так, как вы хотите, и запускать их в этом обработчике.

+0

Это похоже на работу достаточно хорошо. Поскольку мои контроллеры именуются их именем группы, я должен иметь возможность искать их для поиска (например, App \ Http \ Controllers \ Api \). –

+0

Последующий вопрос: как я поймаю ModelNotFoundExceptions, которые возникают, когда я использую привязку модели маршрута, и модель не найдена? Мой контроллер не будет находиться в трассировке стека, поскольку ошибка возникает перед загрузкой контроллера. –

+1

@frasmage Вы могли бы, вероятно, выбросить свое собственное исключение, чтобы упростить его: http://laravel.com/docs/4.2/routing#route-model-binding –

Смежные вопросы