我有一个主站点和一个管理控制台。
我希望每个版本都有不同的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
中使用来获得用户角色,该角色工作正常,没有任何异常。我该如何解决?
答案 0 :(得分:1)
根据路线,有两种方法可以完成不同的404视图。两者都将使您拥有以下错误页面:
/resources/views/acp/errors/404.blade.php
/resources/views/errors/404.blade.php
将按顺序检查目录,直到找到视图为止,这意味着您可以有选择地添加自定义错误视图,并在不存在错误视图时使用默认视图。如果路由不匹配,则不会查找自定义错误页面。
在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'))
);
}
}
创建一个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中间件可能会 did 运行,并且您可以访问用户。
在错误视图中,您必须检查用户是否登录:
@guest
<p>Hello, guest</p>
@else
<p>Hello, {{ auth()->user()->name }}</p>
@endguest
如果这对于您的用例来说还不够好,那么您可能需要尝试Route::fallback(),它允许您定义一个控制器来服务404页面并确实运行Web中间件。