Использование 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 }}
?>
Если бы вы могли привести мне пример.
Ответы
Ответ 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;