Laravel 5.0自定义404不使用中间件

时间:2015-06-10 19:10:09

标签: laravel http-status-code-404 middleware

我正在使用中间件来解析模板的输出。这适用于所有页面。

但是,当我想显示404(有一个自定义页面)时,它不会将其视为http请求(这是我的想法),因为它不会通过中间件。

我的问题是,如何让所有请求都通过中间件。

4 个答案:

答案 0 :(得分:2)

The error pages don't go through the routes.php.

In Kernel.php move your middleware from the $routeMiddleware array to $middleware array.

Middleware in this array will run on every request (tested in 5.1).

Image showing middleware and a 404 page

答案 1 :(得分:1)

在Laravel 5.4和可能的旧版本中,您可以像这样修改文件app/exceptions/Handler.php和函数render

if( is_a( $exception, \Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class ) ) {
    return redirect()->route( 'error_404' );
}

// ... old code in the function ...

通过这种方式,每个404错误都会被重定向到某个真实路由,就像其他站点路径一样。

您也可以提交当前请求中的任何数据,以便在目标位置显示合理的错误。

答案 2 :(得分:0)

对于像我这样因怪异行为而在2020年花费时间的人...

Laravel中现在有了新的乐器“ {Fallback Routes»”。

将此添加到/routes/web.php

Route::fallback(function () {
    return view("404"); // template should exists
});

此后,所有请求将通过中间件。

答案 3 :(得分:0)

我有一个用例,其中 api 路由需要始终返回 json 响应。

所有路由都返回 json 响应 (laravel 通过 $request->expectsJson() 进行检查) 如果用户通过发送 accept: application/json 标头明确要求它。< /p>

但是很多时候用户不会发送标头,而是得到一个 html 响应。

至于我的用例,所有 api 路由将始终发送 json 响应 we can force the routes to return json,通过使用中间件手动附加 accept: application/json 标头。

App\Http\Middleware\ForceJsonOnAPIs.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Str;

class ForceJsonOnAPIs
{
    /**
     * Handle an incoming request.
     *
     * @param Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        // Force Json accept type on api routes
        if ($request->is('api/*') && !Str::contains($request->header('accept'), ['/json', '+json'])) {
            $request->headers->set('accept', 'application/json,' . $request->header('accept'));
        }

        return $next($request);
    }
}

App\Http\Kernel.php中注册中间件

// add the new middleware ForceJsonOnAPIs
protected $middleware = [
    \App\Http\Middleware\ForceJsonOnAPIs::class,

    // rest of the middleware,
];

重要提示:你可以像web或者api一样在内核中将中间赋值给$middlewareGroups,但是当出现404异常时你会遇到麻烦。问题是 The error pages don't go through the routes.php(感谢上面的@Björn 回答)因此不会调用路由中间件并且 404 将返回 html 响应。

验证或身份验证异常的情况相同。

在我看来,最好在 $middleware 数组中分配中间件并在中间件本身中处理路由检查。所有异常都会自动返回正确的异常作为 api 路由中的 json。