2013-04-20 2 views
45

В Laravel 4 мой контроллер использует расположение лезвий:Как передать переменную в макет с использованием шаблонов Laravel Blade?

class PagesController extends BaseController { 
    protected $layout = 'layouts.master'; 
} 

Мастера макет имеет выводит переменный заголовок, а затем отображает вид:

... 
<title>{{ $title }}</title> 
... 
@yield('content') 
.... 

Тем не менее, в моем контроллере я только по всей видимости, иметь возможность передавать переменные в подвью, а не в макет. Например, действие может быть:

public function index() 
{ 
    $this->layout->content = View::make('pages/index', array('title' => 'Home page')); 
} 

Это будет только передать переменную $title в разделе содержимого представления. Как я могу предоставить эту переменную для всего представления или, по крайней мере, макет-макет?

ответ

123

Если вы используете @extends в макете содержимого вы можете использовать это:

@extends('master', ['title' => $title]) 
+4

OP должен отметить это как правильный ответ – clod986

+2

Лучший ответ. Спасибо @ s3v3n –

+0

Мне понадобилось много поискового запроса, чтобы найти это! Именно этот синтаксис вы должны получить, и документы не показывают всех этих тонкостей. Я имею в виду, что это официальные документы говорят '@component ('alert', ['foo' => 'bar'])' ...... –

5

Похоже, что я могу передать переменные для всего макета с использованием атрибутов на объекте макета, например, чтобы решить мою проблему, я был в состоянии сделать следующее:

$this->layout->title = 'Home page'; 
+0

Да, хотя я не знаю, почему вы используете '@ yield', почему бы не просто {{$ content}}'? –

+0

«@ yield» переделает представление или что-то еще? Я использовал его только потому, что это было то, что я собрал из других ресурсов. – Dwight

+0

'@ yield' используется для разделов. См. Документацию [Blade documentation] (http://four.laravel.com/docs/templates#blade-templating), где он описывает '@ section' и' @ yield' –

17

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

$title = 'My Title Here'; 
    View::share('title', $title); 

$ this-> layout-> title = 'Домашняя страница'; тоже не работает.

+0

приятный и правильный – m4tm4t

+0

Это самое простое и правильное решение этой проблемы - Спасибо – Muhammad

+0

Это работало для меня в laravel 5.1. Самый простой способ решить проблему. – Chuy

0
$data['title'] = $this->layout->title = 'The Home Page'; 
$this->layout->content = View::make('home', $data); 

Я сделал это до сих пор, потому что мне нужно было как в представлении, так и в главном файле. Кажется, если вы не используете заголовок $ this-> layout->, он не будет доступен в макете макета. Усовершенствования приветствуются!

0

Вы можете попробовать:

public function index() 
{ 
    return View::make('pages/index', array('title' => 'Home page')); 
} 
0
class PagesController extends BaseController { 
    protected $layout = 'layouts.master'; 
} 

public function index() 
{ 
    $this->layout->title = "Home page"; 
    $this->layout->content = View::make('pages/index'); 
} 

В файле шаблона лезвию, ПОМНИТЕ использовать @ перед переменной.

... 
<title>{{ $title or '' }}</title> 
... 
@yield('content') 
... 
6

В лезвию Шаблон: определить переменную как этот

@extends('app',['title' => 'Your Title Goes Here']) 
@section('content') 

А в приложении .blade.php или любой другой по вашему выбору (я просто следую настройке по умолчанию Laravel 5)

<title>{{ $title or 'Default title Information if not set explicitly' }}</title> 

Это мой первый ответ здесь. Надеюсь, он работает. Удачи!

+0

Отлично, спасибо! – lpil

+0

Это помогло мне сэкономить несколько часов ..! Использовал его в Laravel 5.4, и он отлично работает .. Спасибо за ответ ... –

+0

Мне пришлось сделать: '{{$ title ?? 'Default Title'}} ' –

2

Простейший способ решить:

view()->share('title', 'My Title Here'); 

Или с помощью просмотра Фасад:

use View; 

... 

View::share('title', 'My Title Here'); 
+0

Могу ли я выполнить его в промежуточном программном обеспечении маршрута? – mukade

16

Для будущих Google'rs, которые используют Laravel 5, теперь вы можете также использовать его включает,

@include('views.otherView', ['variable' => 1]) 

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

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