在Laravel composerserveprovider中使用Auth::user()


Using Auth::user() in Laravel ComposerSeriveProvider

我有一个侧边栏,我想在其中显示登录用户最喜欢的主题。

我使用ComposerServiceProvider在视图中设置用户的数据:

public function boot(UserRepository $userRepository)
{
    if(Auth::check()) {
        view()->composer('common.sidebar', function ($view) use($userRepository) {
            $view->with('topics', $userRepository->getRecentFollowingTopics(Auth::user()));
        });
    }
}

但是正如文档所说,这将在其他服务(如Auth)之前加载,因此Auth::check()在这里不起作用。他们还写到:https://github.com/laravel/framework/issues/7600

我如何实现使用 viewcomposer 检查用户身份验证?还有任何其他的建议,感谢。

在您的启动函数中Auth尚未可用,这是正确的。

然而,在你的闭包中它是!因此,只需将代码重构为:

// Notice the dependency injection of the Guard! Don't forget to import it on top of your Service Provider
public function boot(Guard $auth, UserRepository $userRepository)
{
    view()->composer('common.sidebar', function ($view) use($auth, $userRepository) {
        if($auth->check()) {
            $view->with('topics', $userRepository->getRecentFollowingTopics($auth->user()));
        }
    });
}

在这种情况下,我也可能重构你的getRecentFollowingTopics函数返回null,如果$auth->user()应该是null(它是,如果没有用户登录),只是检查isNull($topics)在你的模板。

还有,你知道吗,在Laravel 5中,你可以像这样直接向blade注入类:

@inject('userRepository', 'App'UserRepository')

,然后使用它,例如:

@if(!is_null($topics = $userRepository->getRecentFollowingTopics(auth()->user())))
    @foreach ($topics as $topic)
    ....
    @endforeach
@else
    show whatever you like
@endif