web-dev-qa-db-fra.com

Laravel - Différence entre @yield et @section?

À partir de Laravel docs , vous pouvez inclure des "sections" dans les mises en page de deux manières:

<html>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

Puisque @yield peut également transmettre du contenu par défaut à l'aide de @yield('section', 'Default Content'), @yield est-il simplement un raccourci pour un @section qui n'utilise pas @parent?

@section
    <!-- Nothing here -->
@show

Quelles sont les autres différences?

18
dayuloli

Cette ligne supprime la confusion: "Notez que les vues qui étendent une présentation de lame remplacent simplement des sections de la présentation. Le contenu de la présentation peut être inclus dans une vue enfant en utilisant la directive @parent dans une section".

Ainsi, si vous avez déjà défini un @section dans la présentation principale, il sera remplacé à moins que vous ne spécifiiez @parent à l'intérieur du @section de la présentation enfant.

Mais pour @yield, il obtient toujours la section de la disposition enfant. Cela signifie qu'il remplace toujours la partie @yield, même si sa valeur par défaut est @yield('section', 'Default Content').

J'espère que cela efface votre confusion. Dites moi si vous avez d'autres questions. Merci

21
Sameer Nyaupane

Réponse courte _: Utilisez toujours @yield à moins que vous ne vouliez faire quelque chose de plus compliqué que de fournir une valeur par défaut string.


Réponse longue: Les deux @ rendement et @section .. @show sont utilisés pour être éventuellement remplacés chaque fois que vous étendez le modèle de lame. Tout ce que vous pouvez faire avec @ rendement peut également être fait avec @section .. @show, mais pas l'inverse. Voici ce qu'ils font:

@yield ('main')

  • Peut être remplacé par @section ('main') .. @endection
  • Peut être fourni avec une chaîne par défaut mais pas de HTML! La chaîne par défaut sera affichée dans le gabarit de sous-lame si aucun @section ('main') .. @endsection n'est fourni.

@section ('main') .. @show

  • Peut être remplacé par @section ('main') .. @endection
  • Peut être fourni avec un code HTML par défaut. Le code HTML par défaut sera affiché dans le modèle de sous-lame lorsque aucun @section ('main')} n'est fourni.
  • Peut être remplacé par @section ('main') @ parent .. @endsection et affiche en plus le code HTML par défaut.

Voici quelques exemples: test.blade.php

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    <h1>This is a test</h1>

    @yield('mainA')
    @yield('mainB', 'This is the alternative 1')
    @yield('mainC', '<p>This is the alternative 2</p>')
    @yield('mainD', 'This is the alternative 3')

    @section('testA')
    @show

    @section('testB')
      This is the alternative 4
    @show

    @section('testC')
      <p>This is the alternative 5</p>
    @show

    @section('testD')
      <p>This is the alternative 6</p>
    @show


  </body>
</html>

voici un autre fichier appelé testA.blade.php qui étend l'autre fichier à lames:

@extends('test')

@section('mainD')
  <div>
    <p>First replacement!</p>
    <hr>
  </div>
@endsection

@section('testC')
  <div>
    <p>Second replacement!</p>
    <hr>
  </div>
@endsection

@section('testD')
  @parent
  <div>
    <p>Additional content</p>
    <hr>
  </div>
@endsection

Et c'est le résultat:

 enter image description here

13
Adam

yield('content') est un marqueur. Par exemple, dans la balise si vous mettez une yield('content'), vous dites que cette section a le nom du contenu et vous pouvez nommer ce que vous voulez à l'intérieur de la parenthèse. ça n'a pas besoin d'être content. il peut être céder («à l'intérieur»). ou tout ce que vous voulez.

Ensuite, dans la page enfant où vous souhaitez importer du code HTML à partir de votre page de présentation, vous dites simplement section('name of the section').
Par exemple, si vous avez marqué votre en-tête dans votre page de mise en page comme return('my_head_band') <- ou tout autre élément de votre choix, dans votre page enfant, vous dites simplement @section('my_head_band').

Cela importerait l'en-tête de la page de mise en page dans votre page enfant. vice versa avec votre section de corps qui dans ce cas a été nommé en tant que contenu.

J'espère que cela t'aides.

2
Pradeep Sahoo

Pour ajouter quelque chose de petit, @yield définit en gros une section à injecter par les données overwriting et fonctionne également si notre vue @extends est la vue parent. 

Désormais, lorsque nous overwrite, nous remplaçons complètement une implémentation par une nouvelle implémentation, comme si une entreprise pouvait décider de modifier/écraser toute sa technologie si elle réalisait que quelque chose ne va pas. 

Il ne faut pas confondre avec override

0
Tony R.

La réponse la plus courte:

Utilisez @yield dans le masque si vous voulez écraser complètement les données enfants de la mise en page principale.

Utilisez @section dans le masque si vous souhaitez utiliser les données maître et enfants ensemble sur l'enfant avec @parent (ou écrasez les données enfant sur la présentation principale comme @yield)

0
mohammad asghari