如何在循环内屈服时纠正Laravel的Blade变量区域范围?

时间:2016-01-22 04:13:33

标签: php laravel laravel-5 laravel-5.1

当我包含扩展基础刀片的刀片模板时,所包含刀片部分中的所有变量仅显示第一次迭代的变量。

阅读它似乎这里的渲染顺序很重要,视图在变量之前呈现,反之亦然。

注意

  • 我已经阅读了这个问题/答案:Laravel Blade @yield variable scope
  • 以下代码段的复杂性大大降低,因此可以重新构建示例以排除部分/扩展。但是我的真实案例不能

示例

// index.blade.php
//
@foreach($jobs as $job)
    {{ $job->id }} // <-- Correct output, 1,2,3,..N
    @include('job-detail', ['id' => $job->id])
@endforeach

然后在作业详细信息刀片

// job-detail.blade.php
//
@extends('job-base')

A: {{ $id }} // <-- Correct output, 1,2,3,..N

@section('content')
    B: {{ $id }} // <-- Incorrect output, 1,1,1,..1 (or whatever the first index is)
@endsection // have also tried @stop

然后在作业基础刀片

// job-base.blade.php
//
@yield('content') // Have also tried @section('content') + @show

1 个答案:

答案 0 :(得分:1)

在浏览源代码后,即BladeCompilerView/Factory,我注意到以下代码段:

protected function compileOverwrite($expression)
{
    return '<?php $__env->stopSection(true); ?>';
}

在后台,Laravel似乎存储渲染内容(通过包含文件,并以ob_style方式提取当前变量)在键控数组中,视图名称为键。

当stopSection未传递布尔值true时,它会创建一个新键,并且视图将从原始键获取数据。

长话短说,它现在没有记录(5.1+),但可以在5.0的文档中找到: https://laravel.com/docs/5.0/templates

然而,它并没有真正解释为什么&#34;。这个页面似乎解释得更好:

http://laravel-recipes.com/recipes/244/stopping-injecting-content-into-a-section-and-overwriting