Laravel 两种 404 样式

Rob*_*bin 5 php laravel

我有一个主站点和一个管理控制面板。

我希望每个版本都有不同的 404 页。

我该怎么做?我目前在我的app/Exceptions/Handles.php文件中有以下代码:

/**
    * Render an exception into an HTTP response.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Exception  $exception
    * @return \Illuminate\Http\Response
    */
public function render($request, Exception $exception)
{
    if($exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
    {
        $view = $request->is('admin/*') ? 'acp.errors.404' : 'errors.404' ;

        return response()->view($view, [], 404);
    }
    return parent::render($request, $exception);
}
Run Code Online (Sandbox Code Playgroud)

但是我使用该包spatie/laravel-permission并收到以下错误;

Trying to get property 'role' of non-object (View: F:\Development\RPR\site\resources\views\layouts\acp.blade.php) (View: F:\Development\RPR\site\resources\views\layouts\acp.blade.php)
Run Code Online (Sandbox Code Playgroud)

我使用 in acp.blade.php auth()->user()->role, 来获取用户角色,它可以正常工作,没有任何例外。我应该如何解决这个问题?

Tra*_*itz 2

这里有两种方法可以根据路线完成不同的 404 视图。两者都将允许您拥有这些错误页面:

/resources/views/acp/errors/404.blade.php
/resources/views/errors/404.blade.php
Run Code Online (Sandbox Code Playgroud)

将按顺序检查目录,直到找到视图,这意味着您可以有选择地添加自定义错误视图,并在不存在时转为默认视图。如果路由不匹配,则它不会查找自定义错误页面。

选项1

覆盖registerErrorViewPaths()内部app/Exceptions/Handler.php

/**
 * Register the error template hint paths.
 *
 * @return void
 */
protected function registerErrorViewPaths()
{
    parent::registerErrorViewPaths();

    if (request()->is('admin/*')) {
        View::prependNamespace(
            'errors',
            realpath(base_path('resources/views/acp/errors'))
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2

创建一个ViewServiceProvider:

php artisan make:provider ViewServiceProvider
Run Code Online (Sandbox Code Playgroud)

在以下位置注册您的提供商config/app.php

'providers' => [
    // ...

    App\Providers\ViewServiceProvider::class,
],
Run Code Online (Sandbox Code Playgroud)

编辑您的提供商的启动方法:

/**
 * Bootstrap services.
 *
 * @return void
 */
public function boot()
{
    if (request()->is('admin/*')) {
        View::prependNamespace(
            'errors',
            realpath(base_path('resources/views/acp/errors'))
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

对于问题的第二部分,auth()->user()仅当会话中间件运行时才可用。如果 404 是由路由不存在引起的,则请求不会通过 Web 中间件,不幸的是,会话和身份验证信息将不可用。但是,如果 404 是由ModelNotFoundException控制器内部触发引起的,则 Web 中间件可能确实运行并且您可以访问用户。

在错误视图中,您必须检查用户是否已登录:

@guest
    <p>Hello, guest</p>
@else
    <p>Hello, {{ auth()->user()->name }}</p>
@endguest
Run Code Online (Sandbox Code Playgroud)

如果这对于您的用例来说还不够好,那么您可能需要尝试Route::fallback(),它允许您定义一个用于服务 404 页面的控制器并运行Web 中间件。