Laravel9+Passport项目中AppServiceProvider的view()->composer()不触发?
问题原因与解决方案
核心原因
你添加的view()->composer()逻辑完全不会触发,因为View Composer是Laravel为视图渲染流程设计的钩子,只有当系统渲染Blade视图(或其他视图模板)时才会执行。而你的项目是纯API项目,没有任何视图渲染环节,所以不管在register还是boot方法里注册的视图 composer 都不会被调用,自然看不到日志输出。
针对API项目获取当前用户的正确方案
因为是基于Passport的API项目,用户认证逻辑是在HTTP请求生命周期内完成的,你需要在请求处理阶段获取当前用户,而非服务提供者的初始化阶段。以下是几种可行方案:
1. 在中间件/控制器中直接获取
这是最直接的方式,在API的中间件或控制器方法里,通过request()->user()即可拿到当前已认证的用户:
// 在控制器方法中 public function index(Request $request) { $user = $request->user(); \Log::info('当前用户ID:'.$user->id); // 执行你的业务逻辑 } // 在自定义中间件中 public function handle($request, Closure $next) { $user = $request->user(); if ($user) { // 记录用户信息或执行全局逻辑 \Log::info('API请求用户:'.$user->email); } return $next($request); }
注意:要确保路由已经使用了Passport的认证中间件(如auth:api),否则request()->user()会返回null。
2. 监听用户认证事件
通过Laravel的Authenticated事件,在用户通过Passport认证成功后自动触发逻辑:
- 创建事件监听器:
php artisan make:listener UserAuthenticatedListener - 在
app/Providers/EventServiceProvider.php中注册事件与监听器的关联:protected $listen = [ \Illuminate\Auth\Events\Authenticated::class => [ \App\Listeners\UserAuthenticatedListener::class, ], ]; - 在监听器的
handle方法中处理用户逻辑:public function handle(\Illuminate\Auth\Events\Authenticated $event) { $user = $event->user; \Log::info('用户认证成功:'.$user->name); // 执行你需要的全局逻辑,比如记录登录日志、初始化用户相关服务等 }
3. 绑定当前用户到容器(供全局服务使用)
如果需要在自定义服务中注入当前用户,可以通过中间件将用户实例绑定到容器:
// 自定义中间件 app/Http/Middleware/InjectCurrentUser.php class InjectCurrentUser { public function handle($request, Closure $next) { $user = $request->user(); if ($user) { // 将用户实例绑定到容器,后续可通过app('currentUser')获取 app()->instance('currentUser', $user); } return $next($request); } }
然后在app/Http/Kernel.php的$middlewareGroups['api']中注册该中间件(需放在Passport认证中间件之后):
protected $middlewareGroups = [ 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, \App\Http\Middleware\InjectCurrentUser::class, // 加入这个中间件 ], ];
之后在你的服务类中,就可以通过依赖注入或容器实例获取当前用户:
public function __construct(\Illuminate\Contracts\Auth\Authenticatable $currentUser) { $this->user = $currentUser; }
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

