在Laravel附带的那些中间,我在App\Http\Kernel.php
中定义了一些自定义中间件:
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
// Custom Middleware
'custom1' => \App\Http\Middleware\Custom1::class,
'custom2' => \App\Http\Middleware\Custom2::class,
'custom3' => \App\Http\Middleware\Custom3::class,
];
在Custom1
中,我使用auth('web')->user()->id
,它给出了错误Trying to get property 'id' of non-object
。
这个错误有时会在我的生产环境中发生,但并非总是如此,很难找出原因。
我的猜测是用户由于某种原因(会话已过期?)未通过身份验证。如果是这样的话,那么我想知道为什么auth中间件没有抓住这个问题。
在内核文件中还有:
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\Authenticate::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
可能是Custom1
中间件在auth中间件之前执行,我应该在$middlewarePriority
的末尾添加它吗?