Heim  >  Artikel  >  php教程  >  Eine Einführung in die Unterschiede zwischen einigen Abschnitts-Tags in der Laravel-Vorlagen-Engine Blade

Eine Einführung in die Unterschiede zwischen einigen Abschnitts-Tags in der Laravel-Vorlagen-Engine Blade

高洛峰
高洛峰Original
2016-12-27 10:59:061143Durchsuche

Die Blade-Vorlagen-Engine im Laravel-Framework ist sehr einfach zu verwenden, aber die Einführung von Blade in der offiziellen Dokumentation ist nicht detailliert, einige Dinge sind nicht geschrieben und einige sind nicht klar erklärt. Beispielsweise können bei der Verwendung folgende Probleme auftreten:

1. Sowohl @yield als auch @section können austauschbare Blöcke vordefinieren.
2. @section kann mit @show, @stop, @overwrite und @append beendet werden. Was ist der Unterschied zwischen diesen drei?

Dieser Artikel versucht, eine relativ einfache, aber intuitive Einführung in diese Probleme zu geben.

@yield und @section

Zuallererst ist @yield nicht erweiterbar. Wenn der Abschnitt, den Sie definieren möchten, keinen Standardinhalt für die Erweiterung von Untervorlagen hat, verwenden Sie @yield Das Formular ($name, $ default) ist praktischer. Wenn Sie den Inhalt dieses Blocks nicht in der Untervorlage angeben, wird der Standardinhalt angezeigt. Wenn er definiert ist, wird der von Ihnen definierte Inhalt angezeigt. Es ist entweder/oder.

Im Gegensatz dazu kann @section sowohl ersetzt als auch erweitert werden. Dies ist der größte Unterschied. Beispiel:

{{-- layout.master --}}
@yield('title','默认标题')
 
@section('content')
默认的内容
@show
{{-- home.index --}}
@extends('layout.master')
 
@section('title')
  @parent
  新的标题
@stop
 
@section('content')
  @parent
  扩展的内容
@stop

Im obigen Beispiel verwendet die Vorlage @yield und @section, um jeweils einen Block zu definieren, und definiert dann den Inhalt in der Untervorlage, da @yield nicht sein kann erweitert, sodass selbst das Hinzufügen von @parent nicht funktioniert. Der Ausgabeinhalt ist nur „neuer Titel“ und ersetzt den „Standardtitel“. Daher kann die endgültig generierte Seite nur „Standardtitel“ oder „Neuer Titel“ sein, aber nicht beides. Was den durch @section definierten Teil betrifft, so bleibt aufgrund der Verwendung des Schlüsselworts @parent der Inhalt in der übergeordneten Vorlage erhalten, und dann wird der nach der Erweiterung hinzugefügte Inhalt hinzugefügt, und der Ausgabeinhalt wird „Standardinhalt erweitert“ sein Inhalt".

Die Dokumentation auf der offiziellen Website beinhaltet nicht das Schlüsselwort @parent. Es heißt, dass das Standardverhalten „extend“ ist. Das ist falsch. Neueste Dokumentation zu Github ][docs] Korrigiert. @section plus @stop, der Standardwert ist Ersetzung (Injektion), und zum Erweitern muss das Schlüsselwort @parent verwendet werden. Das Schlüsselwort @override hat tatsächlich ein anderes Anwendungsszenario.

@show und @stop

Als nächstes sprechen wir über die Endschlüsselwörter, die @section entsprechen. Was ist der Unterschied zwischen @show und @stop? (Einige Artikel im Internet und einige Editor-Plug-Ins werden auch @endsection auffordern. Dies wurde in Version 4.0 entfernt. Obwohl es abwärtskompatibel ist, wird seine Verwendung nicht empfohlen.)

@show bezieht sich auf die Ausgabe des Inhalts im Abschnitt auf der Seite, wenn die Ausführung diesen Punkt erreicht, während @stop nur die Inhaltsanalyse durchführt und die nachfolgende Verarbeitung des Abschnitts in der aktuellen Vorlage nicht mehr verarbeitet, es sei denn, Überschreiben mit @ außer Kraft setzen (Einzelheiten finden Sie im nächsten Abschnitt). Im Allgemeinen sollte bei der ersten Definition eines Abschnitts @show verwendet werden. Beim Ersetzen oder Erweitern sollte nicht @show, sondern @stop verwendet werden. Das Folgende ist ein Beispiel:

{{-- layout.master --}}
<div id="zoneA">
  @section(&#39;zoneA&#39;)
      AAA
      @show
     
   
</div>
 
 
 
 
<div id="zoneB">
  @section(&#39;zoneB&#39;)
      BBB
      @stop
     
   
</div>
 
 
 
 
<div id="zoneC">
  @section(&#39;zoneC&#39;)
      CCC
      @show
     
   
</div>
{{-- page.view --}}
@extends(&#39;layout.master&#39;)
 
@section(&#39;zoneA&#39;)
aaa
@stop
 
@section(&#39;zoneB&#39;)
bbb
@stop
 
@section(&#39;zoneC&#39;)
ccc
@show

Verwenden Sie in layout.master @stop, um „zoneB“ zu beenden, da es im gesamten Vorlagensystem keine Definition von „zoneB“ gibt, die mit @show endet , Daher wird dieser Block nicht angezeigt. In page.view ist „zoneC“ mit @show definiert, das den Inhalt sofort anzeigt, wenn die Ausführung hier ankommt, und den Inhalt weiterhin gemäß dem Vorlagenvererbungsmechanismus überschreibt, sodass der endgültig angezeigte Inhalt wie folgt lautet:

ccc // 来自 page.view
<div class="zoneA">
  aaa
     
   
</div>
 
 
 
 
<div class="zoneB">
   
</div>
 
 
 
 
<div class="zoneC">
  ccc
     
   
</div>

Wie Sie den Ergebnissen entnehmen können, geht der Inhalt von ZoneB verloren, da @show nicht verwendet wird, um die Engine anzuweisen, diesen Teil des Inhalts auszugeben, während der Inhalt von ZoneC zweimal angezeigt wird und der Die Seitenstruktur von layout.master wird ebenfalls zerstört, da @show zweimal angezeigt wurde.

@append und @override

Wie gerade erwähnt, gibt @override keinen Inhalt in der untergeordneten Vorlage an, um den Standardinhalt der übergeordneten Vorlage zu ersetzen, sondern hat einen anderen Zweck es benutzen? Dabei besteht wiederum die Problematik, dass ein Abschnitt in einer Vorlage mehrfach verwendet werden kann. Das heißt, jeder von uns definierte Abschnitt kann tatsächlich mehrmals in nachfolgenden Untervorlagen erscheinen. Zum Beispiel:

{{-- master --}}
<div>
  @yield(&#39;content&#39;)
     
   
</div>

{{-- subview --}}
@extends('master')

@section('content')
Eine Zeile hinzufügen Inhalt
@append

@section('content')
Weitere Inhaltszeile hinzufügen
@append

@section('content')
Hinzugefügt genug, das ist es.
@stop

Im obigen Beispiel habe ich nur einen Abschnitt mit dem Namen „Inhalt“ in der übergeordneten Vorlage definiert und den Inhalt dieses Abschnitts dreimal in der untergeordneten Vorlage angegeben. Die endgültige Ausgabe dieses Beispiels lautet:

<div>
加一行内容
再加一行内容
加够了,到此为止吧。
</div>

Der dreimal angegebene Inhalt wird im Schlüsselwort @append angezeigt, das angibt, dass der Inhalt hier hinzugefügt wird, sodass der Inhalt fortgesetzt wird zu erweitern. Und am Ende wird @stop verwendet, was darauf hinweist, dass die Verarbeitung dieses Abschnitts hier endet. Wenn Sie weiterhin @append oder @stop verwenden, um den Inhalt dieses Abschnitts anzugeben, wird dies nicht wirksam. Sofern nicht mit @override behandelt. @override bedeutet „Alle vorherigen Definitionen überschreiben und diese hat Vorrang.“ Zum Beispiel:

{{-- master --}}
<div>
  @yield(&#39;content&#39;)
    @yield(&#39;message&#39;)
     
   
</div>
{{-- master --}}
<div>
  @section(&#39;content&#39;)
    加一行内容
    @append
    @section(&#39;content&#39;)
    再加一行内容
    @append
    @section(&#39;content&#39;)
    加够了,结束吧
    @stop
    @section(&#39;content&#39;)
    都不要了,我说的。
    @override
     
   
</div>

Dieses Beispiel ähnelt dem gerade, außer dass am Ende eine Reihe von Definitionen hinzugefügt wird. Die endgültige Ausgabe lautet:

<div>
  都不要了,我说的。
</div>

Daher müssen Sie in einem formalen Projekt manchmal die Daten für die Ausgabe durchlaufen. Sie können @append verwenden, und wenn Sie bestimmte Daten durchlaufen, werden Sie dies feststellen Alle vorherigen sind falsch. Was ist los? Verwenden Sie @override, um sie alle zu überschreiben.

Weitere Informationen zu den Unterschieden zwischen einigen Abschnitts-Tags in der Laravel-Vorlagen-Engine Blade finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn