2015-02-10 8 views
1

Я создал ServiceProvider и поместил туда некоторую логику для создания меню. Эта логика основана на аутентифицированном пользователе. Но, Auth::user()Auth::getUser() не работает, похоже, сеанс не загружен.Larvel5: Аутентифицированный пользователь в Провайдере

Я положил свою логику в boot метод.

Временное решение проблемы, я создаю middleware и ставим туда логику, но я не думаю, что это правильно.

Так ServiceProvider это неправильное место для этой (аналогичной) логики? Или где лучше место для работы с пользователем?

Например:

class MenuServiceProvider extends ServiceProvider { 

    public function boot() { 
     if(Auth::user()->isAdmin()) { // here Auth::user is null 
      $this->createAdminMenu(); 
     } else { 
      $this->createDefaultMenu(); 
     } 
    } 
    public function register() 
    { 
     // 
    } 
+0

Я не понимаю, что вы делаете. Если вы создаете меню для своего вида - это должно быть в вашем представлении Конструктор – Laurence

+0

@TheShiftExchange Я обновляю свой вопрос – xAoc

+0

Я думаю, что это должно быть в View Composer - http://laravel.com/docs/5.0/views#view -композиторы – Laurence

ответ

0

Изображенный на это в то же время борется с проблемой совсем недавно. Проблема, как вы отметили в комментарии, заключается в том, что информация о сеансе еще не началась, когда поставщики услуг загружены, что создает проблему. Решение состоит в том, чтобы создать часть промежуточного программного обеспечения, которое вы можете настроить в своем классе Http Kernel, который загружает его автоматически для каждого запроса.

Таким образом, учитывая ваш код выше, вы могли бы иметь что-то вроде этого:

<?php  
namespace App\Http\Middleware; 

use Auth; 

class MenuMiddleware 
{ 
    public function handle($request, \Closure $next) 
    { 
     if(Auth::user()->isAdmin()) { // here Auth::user is null 
      $this->createAdminMenu(); 
     } else { 
      $this->createDefaultMenu(); 
     } 

     return $next($request); 
    } 

    ... 
} 

Тогда в вашем RouteServiceProvider - просто зарегистрировать промежуточного программного обеспечения в глобальном массиве промежуточного программного обеспечения.

+0

Я решаю это по-другому, я завернутый в композитор, и составлю его только для макета. Но ваш ответ правильный :) – xAoc

+0

Yup, согласился - tbh Я думаю, что композитор - гораздо лучший подход, учитывая, что требуемая логика - это код, относящийся к представлению. – Oddman

Смежные вопросы