【问题标题】:laravel 5 custom 404laravel 5 自定义 404
【发布时间】:2014-12-11 04:58:15
【问题描述】:

这快把我逼疯了。我正在使用 Laravel 5,但 4.2 和生成 404 页面的文档似乎不起作用。

首先,没有 global.php,所以我尝试将以下内容放入 routes.php:

App::missing(function($exception)
{
    return Response::view('errors.missing', array(), 404);
});

这会导致错误“找不到方法缺失()”

Debug 设置为 false。

我已经搜索和搜索,但到目前为止还没有找到有关在 Laravel 5 中设置 404 页面的信息。不胜感激。

【问题讨论】:

标签: php laravel laravel-routing laravel-5


【解决方案1】:

转到 resources/views/errors 并在 404 页面上创建一个 404.blade.php 文件,其中包含您想要的内容,其余的由 Laravel 处理。

【讨论】:

  • 这会起作用,但这不是由开发人员完全控制的,因为您不能在布局中使用错误视图。你可以看到我的答案。
  • 哇,这样的广告@HaykAghabekyan
  • @HaykAghabekyan,您的答案不合适,因为您正在编辑核心文件。这个答案是正确的,因为您可以使用 @extends() 标签在布局内使用错误视图。
  • 这是正确答案。如果您想使用404.twig 进行更多控制,您甚至可以使用 Twig,其余的由 L5 完成。由于它是 twig,请随意扩展您想要的任何模板。
  • 是的,您可以使用@extends(),但是如何设置在父视图中使用的变量?例如你有带有菜单的页眉和页脚。
【解决方案2】:

如果你想有一些全局解决方案,你可以在 /app/Exceptions/Handler.php 中添加以下代码来进行更改

public function render($request, Exception $e)
{
    if ($this->isHttpException($e)) {

        $statusCode = $e->getStatusCode();

        switch ($statusCode) {

            case '404':
                return response()->view('layouts/index', [
                    'content' => view('errors/404')
                ]);
        }
    }
    return parent::render($request, $e);
}

【讨论】:

  • 这是正确的答案。如果您使用 Twig 或 Blade 以外的其他模板引擎,那么这允许您像普通视图一样加载它。虽然,我必须问什么是layouts/index?我将两者都命名为errors.404,并且成功了。
  • layouts 是我用来保存主要模板文件的文件夹,例如 index,这是我的默认模板文件。
【解决方案3】:

在 Laravel 5 中,您可以简单地将自定义 404.blade.php 放在 resources/views/errors 下,仅此而已。对于 500 等其他错误,您可以在 app/Exeptions/Handler.php 中尝试以下操作:

public function render($request, Exception $e)
{

    if ( ! config('app.debug') && ! $this->isHttpException($e)) {
        return response()->view('errors.500');
    }

    return parent::render($request, $e);
}

对 500 个 HTTP Exeptions 执行相同操作

【讨论】:

    【解决方案4】:

    我喜欢案例陈述方法,但它存在一些问题。

    但是,这会捕获所有错误:

    Route::any('/{page?}',function(){
      return View::make('errors.404');
    })->where('page','.*');
    

    【讨论】:

      【解决方案5】:

      Laravel 5 在 app/Exceptions/Handler.php 下已经有一个预定义的渲染方法(第 43 行)。只需在 parent::render 之前插入重定向代码。像这样,

      public function render($request, Exception $e)
      {
          if ($e instanceof ModelNotFoundException) 
          {
              $e = new NotFoundHttpException($e->getMessage(), $e);
          }
      
          //insert this snippet
          if ($this->isHttpException($e)) 
          {
              $statusCode = $e->getStatusCode();
              switch ($statusCode) 
              {
                  case '404': return response()->view('error', array(), 404);
              }
          }
      
          return parent::render($request, $e);
      }
      

      注意:我的视图位于资源/视图下。您可以以某种方式将其放在您想要的任何其他位置。

      【讨论】:

      • 请注意,parent::render($request, $e) 将一些异常 (ModelNotFoundException) 转换为 HttpExceptions。这些将不会被此处添加的覆盖处理。
      【解决方案6】:

      Lavavel 5.8

      resources/views/errors/404.blade.php 中创建一个文件并添加此代码。

      @extends('errors::minimal')
      
      @section('title', __('Not Found'))
      @section('code', '404')
      
      @if($exception)
          @section('message', $exception->getMessage())
      @else
          @section('message', __('Not Found'))
      @endif
      

      然后在你的控制器中你可以使用:

      abort(404, 'Whatever you were looking for, look somewhere else');
      

      【讨论】:

        【解决方案7】:

        我一直在寻找其他问题的答案,但我想如果其他人正在寻找这个问题,我会提供帮助。

        运行命令php artisan vendor:publish 您将看到所有可发布的文件。输入 laravel-errors 的编号 然后将错误文件发布到资源/视图/错误文件夹

        【讨论】:

          【解决方案8】:

          您必须在资源/视图中创建“错误”文件夹并将 404.blade.php 文件放在错误文件夹中。它会完成工作。您不需要在 App/Exception 文件夹中编辑 handler.php 文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-20
            • 2020-05-10
            • 1970-01-01
            • 2015-06-09
            • 2015-04-26
            • 2015-05-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多