You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为Laravel 8的Admin路由单独添加403、404、500、503错误页面

为Laravel 8的Admin路由单独配置自定义错误页面

没问题,要实现只给Admin路由组配专属的403/404/500/503错误页,咱们分几步来:

第一步:创建Admin专属的错误视图文件

首先在你的视图目录下搭建Admin错误页的文件夹结构:

mkdir -p resources/views/admin/errors

然后在这个文件夹里分别创建对应的错误视图文件,比如:

  • resources/views/admin/errors/403.blade.php(权限不足页面)
  • resources/views/admin/errors/404.blade.php(页面不存在页面)
  • resources/views/admin/errors/500.blade.php(服务器内部错误页面)
  • resources/views/admin/errors/503.blade.php(服务不可用页面)

你可以根据Admin后台的UI风格编写这些视图,比如继承Admin的布局模板,保持和后台样式统一。

第二步:自定义异常处理器逻辑

接下来需要修改Laravel的异常处理器,让它能识别当前请求是否属于Admin路由,再返回对应的错误页。打开app/Exceptions/Handler.php文件:

1. 确定Admin路由的判断依据

首先你得明确怎么区分Admin路由——比如你的Admin路由是不是用了prefix('admin'),或者有专属的中间件(比如auth:admin)。这里假设你的Admin路由组是这样定义的:

Route::prefix('admin')->group(function () {
    // Admin路由内容
});

那我们可以通过请求的URL前缀判断,或者更严谨一点,用路由名称前缀(如果你给Admin路由都加了as('admin.')的话)。

2. 修改render方法

Handler类的render方法里,添加判断逻辑:

use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\HttpException;

public function render($request, Throwable $exception)
{
    // 判断当前请求是否属于Admin路由
    $isAdminRoute = str_starts_with($request->path(), 'admin/') 
        || str_starts_with($request->route()?->getName(), 'admin.');

    if ($isAdminRoute) {
        // 处理Admin路由的HTTP异常
        if ($exception instanceof HttpException) {
            $statusCode = $exception->getStatusCode();
            // 检查是否有对应的Admin错误视图
            if (view()->exists("admin.errors.{$statusCode}")) {
                return response()->view("admin.errors.{$statusCode}", [], $statusCode);
            }
        }
        // 处理500级别的服务器错误
        if ($exception instanceof \Error || $exception instanceof \Exception) {
            if (view()->exists('admin.errors.500')) {
                return response()->view('admin.errors.500', [], 500);
            }
        }
    }

    // 非Admin路由,使用默认的错误处理逻辑
    return parent::render($request, $exception);
}

如果你的Admin路由是通过专属中间件区分的,可以把判断逻辑改成检查$request->route()->middleware()里是否包含Admin专属中间件,更精准。

第三步:测试验证

完成上面的步骤后,你可以做几个测试:

  • 访问Admin路由里不存在的页面,应该看到你自定义的404页;
  • 访问一个没有权限的Admin路由,应该看到自定义的403页;
  • 故意在Admin控制器里抛出一个异常,应该看到自定义的500页;
  • 启用维护模式(php artisan down)后访问Admin路由,应该看到自定义的503页。

另外,如果之前缓存过视图,记得清除缓存生效:

php artisan view:clear

这样就实现了只有Admin路由使用自定义错误页,前端路由还是沿用Laravel默认的错误处理~

内容的提问来源于stack exchange,提问作者trzew

火山引擎 最新活动