我正在使用中间件来解析模板的输出。这适用于所有页面。
但是,当我想显示404(有一个自定义页面)时,它不会将其视为http请求(这是我的想法),因为它不会通过中间件。
我的问题是,如何让所有请求都通过中间件。
答案 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).
答案 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。