54 votes

Quelle est la différence entre `@yield` et `@include` dans Laravel Blade?

Je suis en train d'apprendre Laravel (à partir de la version 5.3) et ces deux directives Blade semblent très similaires, la seule différence que je connais est que @include injecte les variables du parent et peut également envoyer d'autres variables.

Quelle est la différence entre @yield et @include?

Quand devrais-je utiliser @yield?

Quand devrais-je utiliser @include?

44voto

Rob Fonseca Points 1729

@yield est principalement utilisé pour définir une section dans une mise en page. Lorsque cette mise en page est étendue avec @extends, vous pouvez définir ce qui va dans cette section avec la directive @section dans vos vues.

La mise en page contient généralement votre HTML, , ,

et

. Vous définissez une zone (@yield) dans la mise en page que vos pages, qui étendent le modèle, vont remplir avec leur contenu.

Dans votre modèle principal, vous définissez la zone. Par exemple :

    @yield('content')

Disons que votre page d'accueil étend cette mise en page

@extends('layouts.app')

@section('content')
    // contenu de la page d'accueil ici
@endsection

Tout HTML que vous définissez dans la section du contenu sur votre vue de page d'accueil dans la section 'contenu' sera injecté dans la mise en page qu'il a étendu à cet endroit.

@include est utilisé pour du HTML réutilisable comme une inclusion PHP standard. Il n'a pas cette relation parent/enfant comme @yield et @section.

Je vous recommande vivement de lire la documentation Laravel Blade pour une description plus complète.

27 votes

Votre réponse ne répond pas vraiment à la question. Ce que vous venez de dire, c'est que à la fois @yield et @include injectent du HTML dans un fichier parent. La documentation de Laravel est aussi très pauvre. Elle ne vise pas les personnes qui sont nouvelles dans Laravel. La principale différence entre @yield et @include est que @include définit la vue à injecter dans le parent. @yield définit la section à injecter. @yield fonctionne uniquement si votre vue @extends la vue parent.

2 votes

Je suis d'accord avec le commentaire précédent. Je suis en train de lire la documentation de Laravel (v8.x) sur les templates Blade et j'ai du mal à comprendre comment tout cela fonctionne. Je comprends le concept de templating, mais Laravel ne rentre pas dans les détails sur la structure globale. Ils fournissent des exemples et vous devez essayer de comprendre la structure à partir de cela. Le fait que de nombreux tutoriels en ligne que j'ai consultés se contentent simplement de répéter la documentation de Laravel ne facilite pas les choses.

27voto

G-Man Points 484

@include and @yield sont deux types d'opérations totalement différents pour importer du code dans le fichier actuel.

@include - importe le contenu d'un fichier séparé dans le fichier actuel à l'endroit où il est placé. par exemple:

Fichier de mise en page :

< some html or other script >

@include('nom_du_fichier_inclus') // "include." indique le sous-répertoire dans lequel se trouve le fichier

< more html or other script >

Fichier inclus (un fichier blade avec un bloc de code):

< some cool code here >

Le contenu du 'nom_du_fichier' (également un fichier blade) est ensuite importé là où se trouve la directive @include.

@yield importe du code à partir d'une "section" dans le fichier enfant (le fichier blade "view"). par exemple:

Fichier de mise en page :

< some html or other script >

@yield('nom_section_necessaire')

< more html or other script >

La section suivante est nécessaire dans le fichier blade "view" qui est défini pour "étendre" ce fichier de mise en page.

Fichier blade "View":

@extends('nom_du_fichier_de_mise_en_page')
... code as neeeded

@section('nom_section_necessaire')
< some cool code here >
@stop

...
more code as needed

Maintenant, le fichier de mise en page importera la section de code qui correspond au nom utilisé.

Plus sur le sujet ici....

3 votes

Donc cela clarifie certainement comment ils sont différents. Mais pourriez-vous partager un exemple quand yield est "meilleur" ou plus approprié qu'un include? Parce que dans les deux cas, vous incluez simplement du code provenant d'un autre emplacement - que ce soit en incluant sélectivement le code d'un autre fichier ou non.

1 votes

Cela semble être la meilleure réponse.

1 votes

Cela semble être la meilleure réponse, en d'autres termes inclure =>> tout le contenu de la page yield => partie du contenu de la page

7voto

Steffo Dimfelt Points 353

La différence entre @yield et @include est la manière dont vous les utilisez.

Si vous avez un type de contenu statique, comme une barre de navigation, cette partie de la page sera toujours au même endroit dans la mise en page. Lorsque vous utilisez @include dans le fichier de mise en page, la barre de navigation sera placée une fois par mise en page. Mais si vous utilisez @yield, vous devrez faire une @section de la barre de navigation sur chaque page qui @extends la mise en page.

@yield est, en revanche, un meilleur choix lorsque le contenu change sur toutes les pages mais que vous voulez quand même utiliser la même mise en page partout. Si vous utilisez @include, vous devrez créer une nouvelle mise en page pour chaque page, en raison de la différence de contenu.

0 votes

Vous pouvez transmettre certaines guerres aux inclus et les rendre "dynamiques", non ?

4voto

Heath Morris Points 1

Aujourd'hui, j'essayais de comprendre cette différence également, et où utiliser chacun, et pourquoi je voudrais en utiliser un plutôt que l'autre. Soyez prévenu, cette réponse est verbeuse et probablement très expliquée.

Snapey des forums Laracasts m'a fait réfléchir à ce sujet de manière appropriée : https://laracasts.com/discuss/channels/laravel/whats-the-difference-between-atinclude-and-atyield

Tout d'abord, @include va inclure un fichier entier, tout comme la fonction include de PHP. C'est génial si vous voulez simplement ajouter un fichier entier de contenu dans le de votre page, par exemple ce qui va inclure tout à l'intérieur de 'content.blade.php' :

@include('content')

        Hey c'est mon contenu.

        et des trucs

Mais @yield, en conjonction avec @extends et les directives @section et @endsection, vous permettra de diviser votre contenu en sections séparées, mais de le garder dans un seul fichier. Ensuite, vous pouvez le @yielder dans la mise en page en morceaux séparés. L'image qui me vient à l'esprit est celle de mélanger la moitié d'un jeu de cartes dans l'autre moitié, dans un classique "riffle" :

@extends('layout')

@section('top_content')
    Hey je suis le titre
@endsection

@section('middle_content')
    Hey comment ça va
@endsection

@section('other_content')
    C'est fini maintenant.
@endsection

        @yield('top_content')

    Quel contenu statique

        @yield('middle_content')

    Encore un peu de contenu statique

        @yield('other_content')

    Contenu statique de pied de page de quelque sorte

Deuxièmement et peut-être plus important, le flux de contrôle est inversé d'une manière qui rend tout beaucoup plus cohérent. Dans le premier exemple, avec @include, vous appelleriez le fichier de mise en page avec l'aide de vue, de manière descendante. Par exemple, voici ce que pourrait être votre code :

Route::get('/', function () {
    return view('layout');
});

Mais avec @yield et @extends, (comme dans le deuxième exemple) vous appelez le fichier de contenu lui-même, et le fichier de contenu regardera d'abord la directive @extends pour se vêtir du fichier de mise en page, comme s'il mettait un manteau. Donc cela se passe en sens inverse, d'une certaine manière, comme de bas en haut. Ensuite, les directives @yield injectent le contenu tel que spécifié. Le fichier de contenu est à qui vous vous adressez dans votre routeur/contrôleur :

Route::get('/', function () {
    return view('content');
});

Vous appelez la vue du contenu, elle regarde la directive @extends pour choisir la mise en page, puis les directives @yield dans le fichier de mise en page injectent les sections @section correspondantes dans la mise en page.

De cette manière, c'est beaucoup plus utile parce qu'en pratique, vous ferez référence à différents contenus lorsque vous ferez référence à différentes vues.

Si vous n'utilisiez que l'instruction @include pour construire vos vues, alors vous devriez passer un slug de contenu différent au fichier de mise en page que vous appelez à chaque fois, peut-être comme ceci :

Route::get('/bienvenue', function () {
    return view('layout', ['content' => 'bienvenue']);
});

Route::get('/profil', function () {
    return view('layout', ['content' => 'profil']);
});

@include($content)

Et cela me semble être un désordre.

Ceci étant dit, @include semble être un excellent moyen d'inclure un petit extrait dans votre fichier de mise en page (celui appelé par la directive @extends), comme la barre de navigation, ou le pied de page, ou quelque chose que vous voulez simplement séparer de votre fichier de mise en page pour des raisons organisationnelles.

1voto

Erin Deji Points 36

@rendement devrait être utilisé lorsque vos contenus seront modifiés @include devrait être utilisé pour les contenus qui ne changeront pas. par exemple en-tête, pied de page

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X