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.