微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – Laravel两款404款式

我有一个站点一个管理控制面板.

我希望每个版本有不同的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);
}

但我使用包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)

我在acp.blade.PHP中使用auth() – > user() – > role来获取用户角色,这个工作正常,没有任何异常.我该怎么解决这个问题?

解决方法

以下是根据路线完成不同404视图的两种方法.两者都允许您拥有这些错误页面

/resources/views/acp/errors/404.blade.PHP
/resources/views/errors/404.blade.PHP

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

选项1

覆盖app / Exceptions / Handler.PHP中的registerErrorViewPaths():

/**
 * 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'))
        );
    }
}

选项2

创建一个ViewServiceProvider:

PHP artisan make:provider ViewServiceProvider

在config / app.PHP注册您的提供者:

'providers' => [
    // ...

    App\Providers\ViewServiceProvider::class,],

编辑提供程序的引导方法

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

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

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

@guest
    <p>Hello,guest</p>
@else
    <p>Hello,{{ auth()->user()->name }}</p>
@endguest

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。