Я пытаюсь получить переменную $ 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 композитор, они просто не работают, как я ожидаю ... возможно, я делаю это неправильно, поэтому я ценю некоторую помощь.
Я думаю, что это 'View :: share' :) – Bogdan
@Bogdan Ouups, спасибо, что заметили – lukasgeiter