如何从 Laravel 中间件返回 404 状态和视图

问题描述 投票:0回答:1

我正在使用样板 Breeze 路由和模板(目前)为 Laravel 10 应用程序构建一个管理部分,并且我有一组前缀路由,我想在以下情况下返回 404 错误:

  1. 没有登录用户
  2. 如果有登录用户,则他们不是管理员

换句话说,只有经过身份验证的用户是管理员时,前缀路由才会产生任何实质性的结果。否则,我希望它显示为路线甚至不存在。

我束手无策,试图从中间件返回 404 错误视图和状态代码。我已经修改代码并阅读文档几个小时了,但毫无结果,但我感觉答案就在我面前,但我错过了一些东西。

这是我在 web.php 路由文件中的代码:

Route::prefix('admin')->middleware(['admin'])->group(function() {
    Route::get('/', [AdminDashboardController::class, 'index'])->name('admin');
});

这是我在管理中间件的handle()函数中的内容:

public function handle(Request $request, Closure $next): Response
{
    if ($request->user() === null || $request->user()->role !== 'admin') {
        return response('This page cannot be found', 404, []);
    }
    
    return $next($request);
}

这段代码运行得很好。但是,我想返回 404 页面和 HTTP 404 状态代码,而不是带有响应消息的纯文本页面。如果我尝试返回除上述内容之外的任何内容,它似乎会直接跳到下一个中间件。如图所示,它会尝试呈现 Breeze 仪表板组件,就好像用户已登录一样,即使用户未登录也是如此。

有人可以指导我如何返回 404 错误页面和状态代码来代替上面的当前响应吗?

laravel laravel-10 laravel-middleware
1个回答
0
投票
public function handle(Request $request, Closure $next): Response
{
    if ($request->user() === null || $request->user()->role !== 'admin') {
        //remove this return response('This page cannot be found', 404, []);
        abort(404); // replace this
    }
    
    return $next($request);
}

这里是设计您自己的 404 错误处理页面的参考 https://magecomp.com/blog/create-custom-error-page-laravel-10/

© www.soinside.com 2019 - 2024. All rights reserved.