将自定义消息(或任何其他数据)传递到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中,您可以为/resources/views/errors目录中的每个响应代码提供Blade视图。例如,404错误将使用/resources/views/errors/404.blade.php

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

扩展Laravel的异常处理程序IlluminateFoundationExceptionsHandler,并用自己的方法覆盖renderHttpException(SymfonyComponentHttpKernelExceptionHttpException $e)方法。

如果你还没有运行php artisan fresh,这对你来说会很容易。只需编辑app/Exceptions/Handler.php,或创建一个新文件。

Handler.php

<?php namespace AppExceptions;
use Exception;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use SymfonyComponentHttpKernelExceptionHttpException;
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(),请参阅SymfonyComponentHttpKernelException

全局共享一个变量怎么样?

 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

最新更新