Подтвердить что ты не робот

Использование ModelNotFoundException

Я начинаю работать в Laravel и хочу больше узнать об использовании обработки ошибок, особенно о объекте ModelNotFoundException.

<?php
 class MenuController extends BaseController {

    function f() {
          try {
                $menus = Menu::where('parent_id', '>', 100)->firstOrFail();
            } catch (ModelNotFoundException $e) {
                $message = 'Invalid parent_id.';
                return Redirect::to('error')->with('message', $message);
            }
        return $menus;
    }
  }
?>

В моей модели:

<?php
 use Illuminate\Database\Eloquent\ModelNotFoundException;  

 class Menu extends Eloquent {
    protected $table = 'categories'; 
}

?>

Конечно, для моего примера нет записей в категориях, у которых есть parent_id > 100, это мой unit test. Поэтому я ожидаю сделать что-то с ModelNotFoundException.

Если я запустил http://example.co.uk/f в своем браузере, я получаю:

Illuminate \ Database \ Eloquent \ ModelNotFoundException
No query results for model [Menu].

страница ошибки laravel - что ожидается, но как мне перенаправить на мой маршрут "ошибка" с заранее определенным сообщением? то есть.

<?php
// error.blade.php

{{ $message }}
?>

Если бы вы могли привести мне пример.

4b9b3361

Ответ 1

В Laravel по умолчанию в объявлении app/start/global.php указан обработчик ошибок, который выглядит примерно так:

App::error(function(Exception $exception, $code) {
    Log::error($exception);
});

Этот обработчик в основном улавливает каждую ошибку, если не было объявлено никакого другого конкретного обработчика. Чтобы объявить конкретный (только для одного типа ошибок), вы можете использовать что-то вроде следующего в вашем файле global.php:

App::error(function(Illuminate\Database\Eloquent\ModelNotFoundException $exception) {

    // Log the error
    Log::error($exception);

    // Redirect to error route with any message
    return Redirect::to('error')->with('message', $exception->getMessage());
});

лучше объявить обработчик ошибок глобально, поэтому вам не придется иметь дело с ним в каждой модели/контроллере. Чтобы объявить какой-либо конкретный обработчик ошибок, не забудьте объявить его после (снизу) обработчика ошибок по умолчанию, потому что обработчики ошибок распространяются от большей части к определенной к общей.

Подробнее о Ошибки и протоколирование.

Ответ 2

Просто используйте пространство имен

try {
    $menus = Menu::where('parent_id', '>', 100)->firstOrFail();
}catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
    $message = 'Invalid parent_id.';
    return Redirect::to('error')->with('message', $message);
}

Или ссылайтесь на внешнее имя с псевдонимом

use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;