Як передати змінну в макет за допомогою шаблону Blade Laravel?


91

У Laravel 4 мій контролер використовує макет 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змінну лише до розділу вмісту подання. Як я можу надати цю змінну для всього подання або, принаймні, для головного макета?

Відповіді:


217

Якщо ви використовуєте @extendsу своєму макеті вмісту, ви можете використовувати це:

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

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

Я роблю це, і на сторінці макета з’являється невизначена помилка. Будь-які ідеї?
LucyTurtle

45

Для майбутніх Google, які використовують Laravel 5, тепер ви також можете використовувати його з включенням,

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

це те, що я шукаю, щоб нарешті створити компонентний додаток на laravel, дякую!
Рон Майкл

якщо я проходжу лише ["один"], як мені це отримати в шаблоні?
Хав'єр Дж. Соліс Флорес

20

Я зміг вирішити цю проблему, додавши це до мого методу контролера:

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

$ this-> layout-> title = 'Домашня сторінка'; теж не працював.


Це працювало для мене в laravel 5.1. Найпростіший спосіб вирішити проблему.
CodeChuck

16

У шаблоні леза: визначте таку змінну, як ця

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

І в app.blade.php або будь-якому іншому на ваш вибір (я просто дотримуюся налаштування Laravel 5 за замовчуванням)

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

Це моя перша відповідь тут. Сподіваюся, це працює. Удачі!


Це допомогло мені заощадити кілька годин ..! Використовував його в Laravel 5.4, і він чудово працює .. Дякую за відповідь ...
Saiyan Prince

2
Мені довелося зробити:{{ $title ?? 'Default Title' }}
Демієну Ó Сілле

5

Найпростіший спосіб вирішення:

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

Або за допомогою вигляду фасаду:

use View;

...

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

чи можу я виконати його в проміжному програмному забезпеченні маршруту?
мукаде

4

Здається, я можу передавати змінні в цілому макет, використовуючи атрибути об’єкта макета, наприклад, щоб вирішити свою проблему, я зміг зробити наступне:

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

8
Це не спрацювало для мене. На даний момент я отримую повідомлення про помилку, яке стверджує, що воно не існує як змінна.
Адам Лібонатті-Рош

де я можу знайти об'єкт макета?
Євген Афанасьєв

1
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')
...

@YevgeniyAfanasyev, це питання ви повинні поставити назад власнику допису. Я просто посилаюся на його кодування. Якось дивно, що ви мене перепитуєте .... І на це мені дали відповідь у 2014 році. Звичайно, я мав на увазі версію, яку він запитував, - Laravel 4.
Широ,

0

Ви можете спробувати:

public function index()
{
    return View::make('pages/index', array('title' => 'Home page'));
}

0

просто спробуйте цей простий метод: у контролері: -

 public function index()
   {
        $data = array(
            'title' => 'Home',
            'otherData' => 'Data Here'
        );
        return view('front.landing')->with($data);
   }

А у вашому макеті (app.blade.php):

<title>{{ $title }} - {{ config('app.name') }} </title>

Це все.


Не могли б ви пояснити, як це вирішує проблему? І що нового він вносить понад попередні (особливо прийняті) відповіді?
gst

Ласкаво просимо до SO! Коли ви розміщуєте відповідь, навіть якщо це нормально, вам слід трохи пояснити це, і у вашому випадку, оскільки є одна подібна, спробуйте пояснити плюси і мінуси вашої відповіді.
Девід Гарсія Бодего,

0

якщо ви хочете отримати змінні розділів, ви можете заплатити так:

$_view      = new \View;
$_sections  = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
  "title" => "Painel"
]
*/

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

Я зробив це до цих пір, тому що мені було потрібно як у поданні, так і в головному файлі. Здається, якщо ви не використовуєте $ this-> layout-> title, він не буде доступний у головному макеті. Ласкаво просимо до вдосконалення!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.