[英]Override section in a laravel blade template throwing undefined variable errors
我正在使用 Laravel 4 和刀片模板,並在嘗試擴展模板時遇到問題。
在我的布局中,我有
@yield('content')
在我的頁面中,我有
@section('content')
Welcome {{ $name }}
@stop
效果很好,我創建了另一個與我的第一個頁面非常相似的頁面,並且只想更改覆蓋管理內容部分。 模板中的其他部分很好。
所以我擴展我的頁面,然后做
@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);
});
我不確定這是一個bug還是故意的,但是在解釋刀片指令之前,似乎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
時需要的變量。
例如,問題中的示例:
@extend('my.parent.view', ['name' => ''])
如果需要的數據是提供給兒童的觀點,但以不同的名稱這種做法會特別有用。
例如,如果父視圖需要$parent
變量,但子視圖只有一個$child
變量,該變量具有引用父變量的屬性,則可以執行以下操作:
@extend('my.parent.view', ['parent' => $child->parent])
在您的頁面中試試這個:
@section('content')
@hasSection('content')
@yield('content')
@else
Welcome {{ $name }}
@endif
@stop
並閱讀這篇文章以獲得更多靈感https://laracasts.com/discuss/channels/laravel/laravel-blade-layouts-inheritence-problem
我找到了解決這個問題的簡單方法:)
只需在父視圖中調用的變量/方法之前添加@符號即可。 如果出現錯誤(通知/警告),PHP將忽略該錯誤並繼續執行。
它並不完美,但請將我們保存到代碼視圖/作曲家。
希望這有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.