2015-10-17 83 views
2

我有一个侧边栏,我想在其中显示登录用户喜欢的主题。在Laravel ComposerServeProvider中使用Auth :: user()

我使用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::check()不在这里工作。当他们还写了这一点: https://github.com/laravel/framework/issues/7600

我如何能实现使用ViewComposers与检查用户身份验证?此外任何其他建议appriciated。

回答

4

在您的启动功能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你可以注入类直接进入刀片这样的:

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

,然后使用它,例如,像这样:

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

完美的作品,谢谢!也不知道'@ inject' :) – Iamzozo

相关问题