Maison  >  Article  >  php教程  >  Une introduction aux différences entre certaines balises de section dans le moteur de modèles Laravel Blade

Une introduction aux différences entre certaines balises de section dans le moteur de modèles Laravel Blade

高洛峰
高洛峰original
2016-12-27 10:59:061184parcourir

Le moteur de modèles Blade dans le framework Laravel est très simple à utiliser, mais l'introduction de Blade dans la documentation officielle n'est pas détaillée, certaines choses ne sont pas écrites et d'autres ne sont pas clairement expliquées. Par exemple, vous pouvez rencontrer les problèmes suivants lors de l'utilisation :

1. @yield et @section peuvent prédéfinir des blocs remplaçables. Quelle est la différence entre les deux ?
2. @section peut se terminer par @show, @stop, @overwrite et @append Quelle est la différence entre ces trois ?

Cet article tente de donner une introduction relativement simple mais intuitive à ces questions.

@yield et @section

Tout d'abord, @yield n'est pas extensible. Si la section que vous souhaitez définir n'a pas de contenu par défaut pour les sous-modèles à développer, utilisez @yield. Le formulaire ($name, $ default) est plus pratique. Si vous ne spécifiez pas le contenu de ce bloc dans le sous-modèle, il affichera le contenu par défaut. S'il est défini, il affichera le contenu que vous avez défini. C’est soit/ou.

En revanche, @section peut à la fois être remplacée et étendue. C'est la plus grande différence. Par exemple :

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

Dans l'exemple ci-dessus, le modèle utilise @yield et @section pour définir un bloc respectivement, puis définit le contenu dans le sous-modèle puisque @yield ne peut pas l'être. développé, donc même l'ajout de @parent ne fonctionne pas. Le contenu de sortie est uniquement un "nouveau titre", remplaçant le "titre par défaut". Par conséquent, la page finale générée ne peut être que le « titre par défaut » ou le « nouveau titre », mais pas les deux. Quant à la partie définie par @section, grâce à l'utilisation du mot-clé @parent, le contenu du modèle parent sera conservé, puis le contenu ajouté après expansion sera ajouté, et le contenu de sortie sera "contenu par défaut développé contenu".

La documentation sur le site officiel n'implique pas le mot-clé @parent. Elle indique que le comportement par défaut est "étendre". Pour le remplacer, vous devez utiliser @override pour y mettre fin. Dernière documentation sur github ][docs] Corrigé. @section plus @stop, la valeur par défaut est le remplacement (injection) et le mot-clé @parent doit être utilisé pour développer. Le mot-clé @override a en fait un autre scénario d'application.

@show et @stop

Parlons ensuite des mots-clés de fin correspondant à @section Quelle est la différence entre @show et @stop ? (Certains articles sur Internet et certains plug-ins d'éditeur afficheront également @endsection. Cela a été supprimé dans la version 4.0. Bien qu'il soit rétrocompatible, son utilisation n'est pas recommandée).

@show fait référence à la sortie du contenu de la section sur la page lorsque l'exécution atteint ce point, tandis que @stop effectue uniquement l'analyse du contenu et ne traitera plus le traitement ultérieur de la section dans le modèle actuel, sauf si Remplacer par @ remplacement (voir la section suivante pour plus de détails). De manière générale, lors de la première définition d'une section, @show doit être utilisé. Lors de son remplacement ou de son extension, @show ne doit pas être utilisé, mais @stop doit être utilisé. Voici un exemple :

{{-- 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

Dans layout.master, utilisez @stop pour terminer "zoneB". Puisqu'il n'y a pas de définition de "zoneB" se terminant par @show dans l'ensemble du système de modèles. , Ce bloc ne sera donc pas affiché. Dans page.view, 'zoneC' est défini avec @show, qui affichera le contenu immédiatement lorsque l'exécution arrive ici, et continuera à écraser le contenu selon le mécanisme d'héritage du modèle, de sorte que le contenu final affiché sera :

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

Comme le montrent les résultats, le contenu de la zoneB est perdu car @show n'est pas utilisé pour dire au moteur de sortir cette partie du contenu, alors que le contenu de la zoneC sera affiché deux fois, et le La structure des pages de layout.master est également détruite car @show est apparu deux fois.

@append et @override

Comme mentionné tout à l'heure, @override ne spécifie pas le contenu du modèle enfant pour remplacer le contenu par défaut du modèle parent, mais a un autre objectif. l'utiliser ? Cela implique à nouveau le problème selon lequel une section peut être utilisée plusieurs fois dans un modèle. C'est-à-dire que chaque section que nous définissons peut en fait apparaître plusieurs fois dans les sous-modèles suivants. Par exemple :

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

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

@section('content')
Ajouter une ligne de contenu
@append

@section('content')
Ajouter une autre ligne de contenu
@append

@section('content')
Ajouté ça suffit, c'est parti.
@stop

Dans l'exemple ci-dessus, j'ai uniquement défini une section nommée "contenu" dans le modèle parent, et j'ai spécifié le contenu de cette section trois fois dans le modèle enfant. Le résultat final de cet exemple est :

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

Le contenu spécifié trois fois est affiché. La clé réside dans le mot-clé @append, qui indique "le contenu ici est ajouté à", donc le contenu continuera. pour agrandir. Et @stop est utilisé à la fin, indiquant que le traitement de cette section se termine ici. Si vous continuez à utiliser @append ou @stop pour spécifier le contenu de cette section, cela ne prendra pas effet. Sauf si géré avec @override. @override signifie "écraser toutes les définitions précédentes, et celle-ci prévaudra". Par exemple :

{{-- 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>

Cet exemple est similaire à celui de tout à l'heure, sauf qu'un ensemble de définitions est ajouté à la fin. Le résultat final sera :

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

Par conséquent, dans un projet formel, vous devez parfois parcourir les données pour la sortie, vous pouvez utiliser @append, et si vous parcourez certaines données, vous constaterez que tous les précédents sont faux. Utilisez @override pour tous les remplacer.

Pour plus d'informations sur les différences entre certaines balises de section dans le moteur de modèles Laravel Blade, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn