Как я могу выпрямить Laravel blade @ extends порядок выполнения?

В моих попытках найти способ передать переменную по ссылке на blade-сервер @include я построил простой тестовый пример, который также демонстрирует, что порядок выполнения шаблона довольно изменчив. Есть ли способ использовать шаблоны клипов с переменной, где порядок выполнения имеет значение (в частности, в отношении разделов)?

Прецедент:

testLayout.blade.php

<!DOCTYPE html> <html> <head> </head> <body> {{"this is the layout: ".++$tabindex."<br>"}} @include('testInclude') {{"this is the layout after include: ".++$tabindex."<br>"}} @include('testInclude',array('tabindex'=>$tabindex)) {{"this is the layout after passing include: ".++$tabindex."<br>"}} @yield('testYield') {{"this is the layout after yield: ".++$tabindex."<br>"}} @section('testSection') {{"this is the layout section: ".++$tabindex."<br>"}} @show {{"this is the layout after section: ".++$tabindex."<br>"}} </body> </html> 

testExtension.blade.php

 @extends('testLayout') {{"this is the extension: ".++$tabindex."<br>"}} @include('testInclude') {{"this is the extension after include: ".++$tabindex."<br>"}} @include('testInclude',array('tabindex'=>$tabindex)) {{"this is the extension after passing include: ".++$tabindex."<br>"}} @section('testYield') {{"this is the extension yield: ".++$tabindex."<br>"}} @stop {{"this is the extension after yield: ".++$tabindex."<br>"}} @section('testSection') {{"this is the extension section: ".++$tabindex."<br>"}} @parent {{"this is the extension section after parent: ".++$tabindex."<br>"}} @stop {{"this is the extension after section: ".++$tabindex."<br>"}} 

testInclude.blade.php

 {{"this is the include: ".++$tabindex."<br>"}} 

routes.php

 Route::get('test', function(){ return View::make('testExtension',array('tabindex'=>0)); }); //I have used View::share in stead and the results are identical 

Вывод:

 this is the extension: 1 this is the include: 2 this is the extension after include: 2 this is the include: 3 this is the extension after passing include: 3 this is the extension after yield: 5 this is the extension after section: 8 this is the layout: 9 this is the include: 10 this is the layout after include: 10 this is the include: 11 this is the layout after passing include: 11 this is the extension yield: 4 this is the layout after yield: 12 this is the extension section: 6 this is the layout section: 13 this is the extension section after parent: 7 this is the layout after section: 14 

Анализ:

Похоже, что значения вычисляются в расширении, а затем вычисляются в макете, а затем повторно упорядочиваются. Поскольку это уже другой отдельный вопрос, пожалуйста, проигнорируйте, что все экземпляры @include являются передаваемыми по значению и, таким образом, не влияют на значение в их включенных файлах. Я также, как правило, меньше обеспокоен ценностями вне секций, потому что поведение там понятно менее предсказуемо. Это проблематично в разделах .

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

Есть ли способ заставить разделы вести себя в порядке или я могу использовать шаблоны только для вещей, где значения не зависят от порядка?

Шаблоны не зависят от заказа. Разделы могут быть перезаписаны с помощью @overwrite, что означает, что они отображаются, когда все загружается, иначе @overwrite может выйти из строя.


Переписывающие разделы

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

 @extends('list.item.container') @section('list.item.content') <p>This is an item of type {{ $item->type }}</p> @overwrite 

http://laravel.com/docs/templates