2015-09-29 2 views
3

В моей BaseController я это:

public function __construct() 
{ 
    $user = Auth::user(); 
    View::share('user', $user); 
} 

я могу получить доступ к массиву $ пользователя на протяжении всех моих взглядов, но что, если я хочу, чтобы быть глобальными переменная доступна во всех моих контроллерах?

У меня есть следующий рабочий код:

use Auth; 
use DB; 

class UsersController extends BaseController 
{ 
    public function index() 
    { 
     $user = Auth::user(); 
     $users = DB::table('users')->where('user_id', $user->user_id)->get(); 
     return view('pages.users.index', compact('users'); 
    } 
} 

Я хочу $ пользовательскую переменную доступной во всех моих контроллеров и внутри всех общественных функций внутри каждого на контроллерах, но я не хочу иметь для повторного использования "использовать Auth;" и "$ user = Auth :: user();"

Я попытался добавить его в __construct в BaseController, но это, похоже, не работает, неопределенная ошибка переменной пользователя $. Есть предположения? Я знаю, что это возможно.

+0

Посмотрите на Laravel промежуточного слоя, это может помочь вам. http://laravel.com/docs/5.0/middleware – sandeepsure

+0

Почему вы не используете для этого вспомогательную функцию? –

ответ

3

Показал в другие ответы, вы можете:

  • набор его как свойство базового контроллера (я не рекомендую это, он просто добавляет беспорядок)
  • создания пользовательского помощника (см ниже)
  • вобще \Auth::user()


Другая техника, вы можете использовать auth() помощника:

auth()->user() 

Это даже documented.


Согласно this PR, нет никакого плана, чтобы добавить user() помощника в Laravel.

Если вы считаете, что стоит добавить этот помощник для вашего проекта, вот код:

function user() 
{ 
    // short and sweet 
    return auth()->user(); 

    // alternative, saves one function call!! 
    return app('Illuminate\Contracts\Auth\Guard')->user(); 
} 
3

Я не вижу, почему-то, как это не будет работать:

public function __construct() 
{ 
    $this->user = \Auth::user(); 
    \View::share('user', $this->user); 
} 

Таким образом, он доступен для всех ваших мнений и до тех пор, пока ваши контроллеры расширяют BaseController, это доступно во всех контроллерах, а также с $this->user.

+2

В то время, когда конструктор контроллера вызван, сеанс еще не инициализирован, поэтому 'Auth :: user() == null'. –

1

Не знаю, в чем проблема с использованием Auth::user(), этот класс использует одноэлементный шаблон, что означает, что если Auth::user() уже инициализирован, он не будет проверять снова на базу данных, особенно если большая часть кода не должна даже быть внутри контроллера так что в основном вы все равно должны были бы сделать Auth::user() внутри ваших услуг, моделей, запросы формы, и т.д ..

abstract class Controller extends BaseController { 
    protected $user; 
    use ValidatesRequests; 
    public function ___construct(){ 
     $this->user = \Auth::user(); 
    } 
} 
1

Почему бы вам не использовать вспомогательную функцию. Он не даст вам переменной пользователя $, но он может дать вам более чистый способ выполнить это.

В вашем helpers.php добавить функцию:

function getUser(){ 
    return Auth::user(); 
} 

Во всех других местах (контроллеров, моделей,) называют: getUser(). Вот и все.

Если у вас еще нет вспомогательного файла для ваших функций. Вы можете следить за этим link, чтобы создать его.

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