You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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认证成功后自动触发逻辑:

  1. 创建事件监听器:
    php artisan make:listener UserAuthenticatedListener
    
  2. 在app/Providers/EventServiceProvider.php中注册事件与监听器的关联:
    protected $listen = [
        \Illuminate\Auth\Events\Authenticated::class => [
            \App\Listeners\UserAuthenticatedListener::class,
        ],
    ];
    
  3. 在监听器的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:35:31