簡體   English   中英

覆蓋 Laravel 刀片模板中的部分,拋出未定義的變量錯誤

[英]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);
});

您可以在此處的文檔中閱讀有關這些方法的更多信息。 (或者這里是Laravel 5文檔。)

我不確定這是一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM