任何人都知道是否可以延长儿童刀片?
我的应用程序有一个通用的布局模板,然后每个页面@extends。 每个页面可以根据需要为其他HTML块提取一系列@includes(例如模态)。
@extends('common.layout')
@section('content')
... Some other content ...
@include('modals.modal-1')
@include('modals.modal-2')
@endsection
所有的模态都有很多常见的样板代码(Bootstrap),所以我想做的是定义一个主模型模板,从中扩展所有模态@extend,然后在我的页面中包含@需要。所以/modals/modal-1.blade.php看起来像是:
@extends('common.modals')
@section('modal-id', 'modal-1')
@section('modal-title','Modal title')
@section('modal-body')
... Some HTML / Blade here ...
@endsection
每次尝试时,生成的HTML都会损坏。在上面的例子中,modal-1会显示两次,因为它首先出现,而modal-2根本不存在。翻转顺序,模态-2将出现两次。
我想我可以简单地将我的模态体放在变量中并在@include语句@include('modal.blade', ['body' => '<div>...</div>'])
中使用它,但使用@extends感觉更正确。
有什么想法吗?
答案 0 :(得分:4)
您绝对可以从已扩展的视图中扩展Blade视图。但是,您正在混合模板继承与视图包含,这会导致您的奇怪结果。
使用@extend
指令继承模板时,必须始终返回所需链上的最低子项。假设您有3代模板:
//grandparent.blade.php
<html>
<head>
<title>My App</title>
</head>
<body>
@yield('parent-content')
</body>
</html>
//parent.blade.php
@extends('grandparent')
@section('parent-content')
<div class="container">
@yield('child-content')
</div>
@endsection
//child.blade.php
@extends('parent')
@section('child-content')
<div class="page">
//stuff
</div>
@endsection
在这种情况下,您将返回子视图,它还包含它上面的两代模板。但是你可以从不返回parent.blade.php
并期望它也返回那个子视图。可能有100个子视图扩展了父级,因此无法知道哪一个。
将@include
指令视为将视图中的HTML细分为较小位的一种方法。通常,您会将它用于要在多个视图中引用的可重用代码段。但它与模板继承不同。还要记住,包含的视图将获得与其父视图相同的所有数据(您甚至可以传递更多信息)。
在您的情况下,您必须确定构成页面基本根的内容。是modal-1
页面的核心吗?如果是这样,您需要从您的控制器返回modal-1
作为您的子视图并将其向上扩展。在这种情况下,请将文件保留在帖子中。其父视图(common.modals
)需要更改为:
@extends('common.layout')
@section('content')
... Some other content ...
@yield('modal-id')
@yield('modals-title')
@yield('modal-body')
@include('modals.modal-2')
@endsection
显然,你会将每个屈服陈述放在页面上有意义的地方。
但是,如果modal-1
不是页面的核心,而只是您要包含的额外内容(如小部件),那么您应该include
它就像你在父视图中一样。在这种情况下,您需要从中删除@extends
指令,并且不打算将主HTML包装在任何部分中。它将按原样传递给视图。如果在包含的模板中包含节,则必须在包含它的视图中将这些节放到该节。因此,您的modal-1
模板最终会显示如下:
<div>
<p>HTML goes here. No need to extend anything or wrap in a section.
You can still include {{$data}} though.
</p>
</div>
@section('script')
Including this section means that the view that is including this template
already contains a @yield('script') directive.
By including the @parent directive, this section will append that one.
@parent
@endsection
答案 1 :(得分:1)
我认为包含已扩展其他模板的模板的正确方法是使用@overwrite
代替所包含模板中的@endsection
:
@extends('common.modals')
@section('modal-id', 'modal-1')
@overwrite
@section('modal-title','Modal title')
@overwrite
@section('modal-body')
... Some HTML / Blade here ...
@overwrite