Передайте пользовательское сообщение (или любые другие данные) в Laravel 404.blade.php

Я использую 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 или создайте новый файл.

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