Laravel Blade:@extend 一个(已经扩展的)子刀片?

Fix*_*pec 4 php laravel blade

有谁知道是否可以延长儿童刀片?

我的应用程序有一个通用布局模板,然后每个页面@extends。每个页面都可以根据需要为其他 HTML 块(例如模态)引入一系列 @include。

@extends('common.layout')

@section('content')
    ... Some other content ...
    @include('modals.modal-1')
    @include('modals.modal-2')
@endsection
Run Code Online (Sandbox Code Playgroud)

所有的模态都有很多通用的样板代码(Bootstrap),所以我想要做的是定义一个主模型模板,从那里得到所有模态@extend,然后根据需要在我的页面中@include那些。所以 /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
Run Code Online (Sandbox Code Playgroud)

每次我尝试时,生成的 HTML 都会损坏。在上述情况下,modal-1 将显示两次,因为它首先出现,而 modal-2 根本不存在。翻转顺序,modal-2 会出现两次。

我想我可以简单地将我的模态体放在一个变量中并在 @include 语句中使用它@include('modal.blade', ['body' => '<div>...</div>']),但使用 @extends 感觉更正确。

有任何想法吗?

And*_*ker 5

您绝对可以从已经扩展的视图中扩展 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将返回子视图,它还将包含其上方的两代模板。但是您永远无法返回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
Run Code Online (Sandbox Code Playgroud)

显然,您会将每个 yield 语句放在页面上有意义的地方。

但是,如果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
Run Code Online (Sandbox Code Playgroud)


Mis*_*erP 0

我相信包含已经扩展了其他一些模板的模板的正确方法是@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
Run Code Online (Sandbox Code Playgroud)