【问题标题】:Override section in a laravel blade template throwing undefined variable errorslaravel 刀片模板中的覆盖部分抛出未定义的变量错误
【发布时间】:2013-10-23 03:08:31
【问题描述】:

我正在使用 Laravel 4 和刀片模板,当我尝试扩展模板时遇到了问题。

在我的布局中

@yield('content')

在我的页面中有

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

效果很好,我创建了另一个与我的第一个页面非常相似的页面,只是想更改覆盖管理内容部分。模板中的其他部分都很好。

所以我扩展了我的页面,然后做

@section('content')
    Hello!
@stop

我收到一个带有 $name 变量的未定义通知。

我试过了

@section('content')
    Hello!
@overwrite

同样的交易,我收到通知错误。 我检查了我的控制器,它使用了正确的模板。我没有调用@parent,所以我不明白,我怎样才能在没有通知错误的情况下覆盖模板中的部分?

【问题讨论】:

    标签: php laravel laravel-4 blade


    【解决方案1】:

    在你的页面试试这个:

    @section('content')
        @hasSection('content')
            @yield('content')
        @else
            Welcome {{ $name }}
        @endif
    @stop
    

    阅读这篇文章以获得更多灵感https://laracasts.com/discuss/channels/laravel/laravel-blade-layouts-inheritence-problem

    【讨论】:

      【解决方案2】:

      我不能保证对 Laravel 4 的支持,但对于那些正在寻找适用于 Laravel 5.5 的解决方案(并且可能更早 - 难以检查)的人来说,是在 @extending 时定义你需要的变量。

      例如在问题的示例中:

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

      如果所需的数据可用于子视图,但使用不同的名称,则此方法可能特别有用。

      例如如果父视图需要一个 $parent 变量,但子视图只有一个 $child 变量,该变量具有引用父视图的属性,您可以这样做:

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

      【讨论】:

        【解决方案3】:

        在渲染任何子节点之前,刀片布局会沿着树向上到达路由视图或主视图。因此,扩展其他视图的嵌套视图必须始终先渲染其父视图。因此,包含部分的父视图将始终在子视图之前呈现。

        要解决您遇到的问题,最好只嵌套不覆盖包含变量的父部分的页面,因为父内容将始终在子内容之前呈现。

        由于不能始终坚持上述理想,或者仍然需要父部分内容,因此一个不错的替代方法是使用视图作曲家。 View Composer 让您有机会在呈现任何特定视图时为它们声明变量。

        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);
        });
        

        您可以在文档here 中阅读有关这些方法的更多信息。 (或 here 获取 Laravel 5 文档。)

        【讨论】:

        • 谢谢,view::composer 是一个非常方便的工具。
        【解决方案4】:

        我找到了解决这个问题的简单方法:)

        只需在父视图中调用的变量/方法之前添加 @ 符号即可。如果出现错误(通知/警告),PHP 将忽略它并继续执行。

        它并不完美,但请把我们保存到代码视图/作曲家。

        希望对您有所帮助!

        【讨论】:

          【解决方案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 被渲染。如果布局文件中的内容包含变量,这似乎是这种方法

          【讨论】:

          • 这完全是故意的。刀片布局必须始终在子级之前渲染父级,否则无法继承。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-08
          • 2014-10-13
          • 2014-11-13
          • 2018-11-26
          • 2017-06-17
          • 1970-01-01
          相关资源
          最近更新 更多