2014-10-28 1 views
0

Я пытаюсь получить переменную $ user, доступную каждый раз, когда вызывается представление «views/layouts/master.blade.php», поэтому это в основном мой текущий подход:Сделать переменные доступными во всем представлении (включая @yields) с использованием композиций вида

приложение/контроллеры/BaseController.php

class BaseController extends Controller{ 

    protected $layout = 'layouts.master';  

    protected function setupLayout(){ 
     if(!is_null($this->layout)){ 
      $this->layout = \View::make($this->layout); 
     } 
    } 

    protected function view($path, $data = []){ 
     return $this->layout->content = \View::make($path, $data); 
    } 

} 

приложение/контроллеры/DashboardController.php

class DashboardController extends BaseController{ 

    public function index(){ 

     return $this->view('dashboard'); 

    } 

} 

App \ Композиторы \ BaseComposer.php

class BaseComposer{ 
    public function compose($view){ 

     $data = array(
      'user' => \Auth::user() 
     ); 

     $view->with($data); 

    } 
} 

приложение/composers.php

View::composer('layouts.master', 'App\Composers\BaseComposer'); 

приложение/просмотров/макеты/master.blade.php

<html> 
    <head>...</head> 
    <body> 
     <header> 
      <button>{{{ $user->name }}}</button> //Button with the user name with a dropdown to log out (I'm using the $user variable from the composer) 
     </header> 
     <div id="content"> 
      @yield('content') 
     </div> 
    </body> 
</html> 

приложение/просмотров/dashboard.blade.php

@extends('layouts.master') //Should I put this eventhough I'm using controller templating? ($layout->content = View::make(...)) 

@section('content') 
    <p class="welcome">Welcome, {{{ $user->name }}}</p> 
@stop 

Когда я попал в индексный метод() Я получаю Undefined переменной: пользователя Исключение на мой взгляд dashboard.blade.php.

Как вы можете видеть, я использую свой BaseController для предоставления некоторых вспомогательных методов просмотра, таких как «setUpLayout» и «view», и оба они запускают View :: make(). Поэтому, хотя я использую свой композитор для вызова «with()» в моем представлении «layouts.master», представление «приборной панели» не будет наследовать эти переменные. Я взглянул на исходный код, и Illuminate \ View \ View :: with() не делает больше, чем добавляет данные в свойство $ data, поэтому кажется, что каждый вызов View :: make() независим друг от друга ,

Итак, вот в чем проблема: как я могу определить только одним вызовом все переменные, которые мне нужны для представления и его «@yields»?

Я исследовал и некоторые люди предлагают определить композитора, как это:

View::composer('*', 'App\Composers\BaseComposer'); 

И это будет работать, но View композитор будет выполняться для каждого отдельного вида. Итак, представьте себе, если у моего композитора View есть вызов БД, квест будет выполняться столько раз, сколько просмотров, которые у меня есть, включая такие виды, как моя папка «views/emails», где мне не нужно звонить композитору ...

Я думал о начале определение моего переменном вида в собственности в моем BaseController и с тех пор я его продлением в моем DashboardController я мог бы сделать что-то вроде:

View::make('dashboard')->with($this->data); 

Но мне нравится идея иметь View композитор, они просто не работают, как я ожидаю ... возможно, я делаю это неправильно, поэтому я ценю некоторую помощь.

ответ

3

Использование View::share() вместо with

class BaseComposer{ 
    public function compose($view){ 

     $data = array(
      'user' => \Auth::user() 
     ); 

     View::share($data); 
    } 
} 

Что касается Вашего комментария в dashboard.blade.php, вам не нужно @extends, если вы всегда установить макет в контроллере, и это лучшая практика, чтобы определить только макет в одном месте.

+0

Я думаю, что это 'View :: share' :) – Bogdan

+0

@Bogdan Ouups, спасибо, что заметили – lukasgeiter

0

Переменные не передаются вдоль заданных разделов, поэтому представление, которое расширяет макет, не получает переменную.Однако вам не нужно использовать подстановочные знаки в композиторе для присоединения переменной к каждому представлению, вы можете указать массив представлений, к которым вы хотите добавить композитор. В вашем случае это вид макета и приборная панель вид:

View::composer(array('layouts.master', 'dashboard'), 'App\Composers\BaseComposer'); 

Вы можете добавить любые другие виды, которые нуждаются в переменной $user, в этом массиве. Для получения дополнительной информации вы можете проверить Laravel Docs.

+0

Спасибо, проблема с этим, помимо того, что нужно вручную определить каждое представление для компоновки, заключается в том, что композитор будет выполнен дважды, и это может вызвать некоторые проблемы, особенно если вы делаете из них запросы БД. Тем не менее, я считаю, что это действительно полезно при определении нескольких представлений, которые не будут отображаться вместе. – enzo

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

  • Нет связанных вопросов^_^