Секция переопределения в шаблоне лезвия ларавеля, бросающая неопределенные переменные ошибки

Я использую Laravel 4 и шаблоны клинков и сталкиваюсь с проблемой при попытке расширить шаблон.

В моем макете у меня есть

@yield('content') 

и на моей странице у меня есть

 @section('content') Welcome {{ $name }} @stop 

который отлично работает, я создал другую страницу, очень похожую на мою первую, и просто хочу изменить переопределить раздел содержимого admin. Другие разделы шаблона в порядке.

поэтому я расширяю свою страницу и делаю

 @section('content') Hello! @stop 

Я получаю неопределенное уведомление с переменной $ name.

Я пытался

 @section('content') Hello! @overwrite 

и такая же сделка, я получаю ошибку уведомления. Я проверил свой контроллер, и он использует правильный шаблон. Я не звоню @parent, поэтому я не понимаю, как я могу перезаписать раздел в шаблоне без ошибок извещения?

Разметки лезвия прокладывают путь вверх по дереву к маршруту или мастер-представлению перед тем, как передать любого из этих детей. Таким образом, вложенные представления, которые расширяют другие, всегда должны иметь их родительскую визуализацию до их появления. В результате родительские представления, содержащие разделы, всегда будут отображаться до рождения.

Чтобы преодолеть проблему, с которой вы столкнулись, это хорошая идея, чтобы только когда-либо вставлять страницы, которые не перезаписывают разделы родителей, содержащие переменные, поскольку контент для родителей всегда будет отображаться перед ребенком.

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

 View::composer(array('pages.admin'), function($view) { $view->with('name', Auth::user()->username); }); 

Другой альтернативой будет использование создателя представления. Создатели запускаются в тот момент, когда представление создается, а не отображается. Этот метод позволяет вам переписать переменную, если вы пожелаете, до отображения визуализации.

 View::creator(array('pages.admin'), function($view) { $view->with('name', Auth::user()->username); }); 

Вы можете прочитать больше об этих методах в документации здесь . (Или здесь для документации Laravel 5.)

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

просмотров / макеты / testlayout.blade.php:

  <html> <body> @yield('sidebar', 'This is the master sidebar. {{ $name }}' ) <div class="container"> @yield('content') </div> </body> </html> 

фактический вид: views / test.blade.php

 @extends('layouts.testlayout') @section('sidebar') No variable in the child @stop @section('content') This is a child content @stop 

Это предотвращает визуализацию переменной $name если в фактическом представлении есть раздел с этим именем. Похоже, что это подход, если содержимое в файле макета содержит переменную

Я не могу гарантировать поддержку Laravel 4, но для тех, кто ищет решение, которое работает в Laravel 5.5 (и, вероятно, справедливый бит дальше назад – трудно проверить), нужно определить переменные, которые вам нужны, когда @extend ing.

Например, в примере в вопросе:

 @extend('my.parent.view', ['name' => '']) 

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

Например, если родительскому представлению нужна $parent переменная $parent , но дочерний вид имеет только переменную $child которая имеет свойство, ссылающееся на родителя, вы можете:

 @extend('my.parent.view', ['parent' => $child->parent]) 

Я нашел легкое решение этой проблемы 🙂

Просто добавьте символ @ перед вызовом переменной / метода в родительском представлении. Если есть ошибка (уведомление / предупреждение), PHP игнорирует это и продолжает выполнение.

Это не идеально, но спасите нас до кодового представления / композиторов.

Надеюсь, эта помощь!