如何使用Laravel 404异常的自定义中间件

时间:2016-12-08 07:58:20

标签: laravel-5 httpexception

在我的Laravel 5.2应用程序中,我有一个名为“购物车”的自定义中间件。我用它来跟踪不同路线上的用户购物车内容。

看起来像这样:

class CartMiddleware
{

    public function handle($request, Closure $next)
    {
        $cart = new Cart();
        $cart_total = $cart->total();

        view()->composer(['layouts.main'], function ($view) use ($cart_total) {
        $view->with('cart_total', $cart_total);
    });
    return $next($request);
}

}

Route::group(['middleware' => ['cart']], function () {
    Route::get('cart', 'CartController@show');
});

当我的应用程序引发404异常时,404.blade.php视图无法呈现,因为它缺少由“购物车”提供的$cart_total。中间件。

有没有办法分配这个'购物车'中间件到我的例外?

  if ($e instanceof HttpException) {
        if ($request->ajax()) {
            return response()->json(['error' => 'Not Found'], 404);
        }
        return response()->view('errors.404', [], 404);
    }
    return parent::render($request, $e);

1 个答案:

答案 0 :(得分:0)

在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错误都会被重定向到某个真实路由,就像其他站点路径一样。

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