web-dev-qa-db-fra.com

Laravel Blade - Avantage du @ slot / @ composant vs @include?

Laravel 5.4 Blade a introduit le concept de composants et de slots - mais je ne vois pas ce qu'ils ajoutent par rapport au @include traditionnel. Si je comprends bien, avec les composants/emplacements, vous faites:

Dans le modèle component-tpl.blade.php:

<div class='container'>
  <h1>{{$slot1}}</h1>
  <h2>{{$slot2}}</h2>
</div>

En utilisant les emplacements dans le modèle de page, vous faites:

@component('component-tpl')
  @slot('slot1')
    The content of Slot 1
  @endslot
  @slot('slot2')
    The content of Slot 2
  @endslot
@endcomponent

Quelles fonctionnalités cela fournit-il par rapport à l'ancien:

@include('component-tpl',['slot1'=>'The content of Slot 1',
'slot2'=>"The content of Slot 2"])

en utilisant exactement le même modèle de lame 'component-tpl.blade.php'?

Qu'est-ce que je rate? Merci pour toutes informations.

Chris

31
ChrisNY

Comme indiqué, il n'y a pas de différence fonctionnelle, mais une utilisation prudente des deux peut vous donner des fichiers de lame plus propres.

Si un emplacement peut contenir du HTML, l'utilisation d'un composant donnera une syntaxe plus propre dans vos fichiers de lame.

@component('test')
   <strong>This text has html</strong>
@endcomponent

versus

@include('test', ['slot' => '<strong>This text has HTML</strong>'])

De même, si un composant n'a pas d'emplacements, une inclusion peut être préférée:

@include('test')

versus

@component('test')
@endcomponent
38
Rick

Je pense que j'ai trouvé une autre différence cruciale. Par exemple, à partir de la documentation de 5.4:

La directive @include de Blade vous permet d'inclure une vue Blade à partir d'une autre vue. Toutes les variables disponibles pour la vue parent seront rendues disponibles pour la vue incluse:

Pour autant que je sache, les composants ont une portée différente d'une vue contenant et donc les variables disponibles pour la vue parent ne sont pas disponibles dans le composant. Vous devez passer une variable à un composant comme celui-ci:

@component('alert', ['foo' => 'bar'])
@endcomponent

Cette discussion est liée à ce problème: tiliser des variables à l'intérieur des Mailables Markdown

12
DavidHyogo

Comme le dit documentation :

Les composants et les emplacements offrent des avantages similaires aux sections et aux dispositions; cependant, certains peuvent trouver le modèle mental des composants et des emplacements plus facile à comprendre .

4
Denis