Я использую Laravel 5, и я создал файл 404.blade.php
в
views/errors/404.blade.php
Этот файл получает визуализацию каждый раз, когда я звоню:
abort(404); // alias of App::abort(404);
Как передать пользовательское сообщение? Что-то вроде этого в 404.blade.php
Sorry, {{ $message }}
Заполнено (пример):
abort(404, 'My custom message');
или
abort(404, array( 'message' => 'My custom message' ));
В Laravel 4 можно использовать App::missing
:
App::missing(function($exception) { $message = $exception->getMessage(); $data = array('message', $message); return Response::view('errors.404', $data, 404); });
(Примечание: скопировано из моего ответа здесь .)
В Laravel 5 вы можете предоставить виды Blade для каждого кода ответа в каталоге /resources/views/errors
. Например, ошибка 404 будет использовать /resources/views/errors/404.blade.php
.
Что не упоминается в руководстве, так это то, что внутри представления у вас есть доступ к объекту $exception
. Поэтому вы можете использовать {{ $exception->getMessage() }}
чтобы получить сообщение, которое вы передали в abort()
.
Расширьте обработчик исключений Laravel, Illuminate\Foundation\Exceptions\Handler
и переопределите renderHttpException(Symfony\Component\HttpKernel\Exception\HttpException $e)
с вашим собственным.
Если вы не используете php artisan fresh
, вам будет легко. Просто отредактируйте app/Exceptions/Handler.php
или создайте новый файл.
<?php namespace App\Exceptions; use Exception; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Symfony\Component\HttpKernel\Exception\HttpException; class Handler extends ExceptionHandler { // ... protected function renderHttpException(HttpException $e) { $status = $e->getStatusCode(); if (view()->exists("errors.{$status}")) { return response()->view("errors.{$status}", compact('e'), $status); } else { return (new SymfonyDisplayer(config('app.debug')))->createResponse($e); } } }
И затем используйте переменную $e
в вашем 404.blade.php
.
т.е.
abort(404, 'Something not found');
и в вашем 404.blade.php
{{ $e->getMessage() }}
Для других полезных методов, таких как getStatusCode()
, обратитесь к Symfony\Component\HttpKernel\Exception
Как обмениваться переменной глобально?
view()->share('message', 'llnk has gone away'); // or using the facade View::share('message', 'llnk has gone away badly');
Просто убедитесь, что в шаблоне отложено значение по умолчанию, если вы забыли его установить.
См. Совместное использование данных с представлениями: http://laravel.com/docs/5.0/views