Blade:在多个子视图中扩展模板
Posted
技术标签:
【中文标题】Blade:在多个子视图中扩展模板【英文标题】:Blade: extending a template in multiple subviews 【发布时间】:2014-09-25 10:53:56 【问题描述】:我正在使用 Blade 将多个子视图包含到刀片应用程序的一组选项卡中。所有子视图都具有相同的整体结构(侧边栏和主要部分)。因此,我创建了一个模板,每个子视图都扩展了该模板。这是结构:
Main.blade.php
<div id="tabs">
<ul>
@foreach($views as $view)
<li><a href="#$view">$view</a></li>
@endforeach
</ul>
@foreach($views as $view)
<div id="$view">
@include($view)
</div>
@endforeach
</div>
template.blade.php
-- formatting stuff --
@yield('content 1')
-- more formatting stuff --
@yield('content-2')
-- more formatting stuff --
tab-*.blade.php
@extends('template')
@section('content-1')
This is tab [whatever number]
@stop
@section('content-2')
Lorem Ipsum
@stop
这里明显的问题是,由于每个子视图都扩展了相同的模板,@yield('content')
存在 3 次,并且所有 3 个包含的子视图都有自己的@section('content')
。似乎正在发生的事情是内容部分的第一个子视图的实现被放置在所有 3 个产量中。
我的意图很明显。我希望每个包含的子视图都实现它自己的模板实例,将其内容放在内容部分,THEN 被拉入主页。这个可以吗?
如果我将 tab-*.blade.php 文件展平并停止使用模板,它可以正常工作。这里的问题是我最终会得到很多代码重复,这些代码最好放在模板中。这是一个紧急选项,但我想以“正确”的方式进行。
注意
我试图重新设计它以避免这个问题,但我真的想不出另一个解决方案。虽然@include
通常用于拉入小的静态片段(页眉、页脚等),但我没有读过任何将其声明为限制的内容。在我看来,最好的方法是将每个视图存储一次,并在需要时将它们拉入主页,这就是我的设计方式。
【问题讨论】:
标准的 php 包含函数也确实执行 top-bottom 解析 ***.com/questions/1376481/php-parsing-on-includes 扩展与它相反,bottom-up 机制,但是你似乎拒绝了。 @msturdy 是的,这是一个错字。实际代码确实使用@yield
。现已修复
@delmadord 当简单地将@include
替换为@extends
时,页面会完全重组自身。它应该是选项卡的一部分的主张现在出现在选项卡标题上方的页面顶部,并且现在显示最后包含的选项卡,而不是第一个。还是不能正常切换。
@delmadord 我想我只是没有得到你想要的东西。你能完全使用我上面提供的代码,发布一个准确而完整的替代品来满足我的需求吗?也许我只需要看看这个例子。
不幸的是什么?发布的示例是完整的,但不能按我希望的方式工作。您不能使用@extends
编写一个完整的演示,说明如何创建完全相同的页面吗?
【参考方案1】:
尝试使用@overwrite
命令代替@stop
例子:
@extends('template')
@section('content-1')
Stuff goes here...
@overwrite
@section('content-2')
More stuff goes here...
@overwrite
来源:https://github.com/laravel/framework/issues/1058#issuecomment-17194530
【讨论】:
【参考方案2】:我想出了一个似乎可行的技巧。在 template.blade.php 中,我使用以下内容:
-- formatting stuff --
@yield(isset($tab) ? "content-1-$tab" : 'content-1')
-- more formatting stuff --
@yield(isset($tab) ? "content-2-$tab" : 'content-2')
-- more formatting stuff --
然后,在 main.blade.php 中,我执行@include('view', ['tab'=>$view])
。这似乎导致content-1
和content-2
的每个实例都被明确命名,从而允许两个子视图分别实现这些部分。这也应该允许实现此模板的任何其他视图继续运行而无需更改任何内容。
【讨论】:
以上是关于Blade:在多个子视图中扩展模板的主要内容,如果未能解决你的问题,请参考以下文章