繁体   English   中英

在Laravel ComposerSeriveProvider中使用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

如何在检查用户身份验证时使用ViewComposers 也有其他建议。

在您的启动功能中, 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()));
        }
    });
}

在这种情况下,如果$auth->user()应该为null (如果没有用户登录,则为null ),并且也可以在模板中检查isNull($topics) ,则我可能还会重构getRecentFollowingTopics函数以返回null

另外,您是否知道在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM