将自定义消息(或任何其他数据)传递给 Laravel 404.blade.php

Pass a custom message (or any other data) to 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);
});

如何全局共享一个变量?

 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

扩展 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);
    }
  }

}

然后,在 404.blade.php 中使用 $e 变量。

abort(404, 'Something not found');

在你的404.blade.php

{{ $e->getMessage() }}

其他有用的方法如getStatusCode(),参考Symfony\Component\HttpKernel\Exception

(注:复制自my answer here。)

在Laravel 5中,您可以为/resources/views/errors目录中的每个响应代码提供Blade视图。例如 404 错误将使用 /resources/views/errors/404.blade.php.

手册中没有提到的是,在视图中您可以访问 $exception 对象。因此,您可以使用 {{ $exception->getMessage() }} 获取传递给 abort() 的消息。