Avez-vous déjà créé un contrôleur pour lequel vous avez dû faire beaucoup de travail pour préparer les variables à transmettre à une vue ? Vous pouvez déplacer ce type de travail vers un modèle de vue. Essentiellement, les modèles de vue sont des classes simples qui prennent certaines données et les transforment en quelque chose d'utilisable pour la vue.
Vous trouverez une explication plus détaillée et quelques bons exemples dans cet article de blog sur Stitcher.io.
Les compositeurs de vues natifs de Laravel ne sont pas les mêmes que les modèles de vues fournis par ce package. Pour en savoir plus sur les différences, rendez-vous sur cet article de blog sur Stitcher.io.
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Vous pouvez installer le package via composer :
composer require spatie/laravel-view-models
Un modèle de vue est une classe dans laquelle vous pouvez appliquer une logique complexe à vos vues. Cela rendra vos contrôleurs un peu plus légers. Vous pouvez créer un modèle de vue en étendant le SpatieViewModelsViewModel
fourni.
class PostViewModel extends ViewModel
{
public $ user ;
public $ post ;
public $ indexUrl = null ;
public function __construct ( User $ user , Post $ post = null )
{
$ this -> user = $ user ;
$ this -> post = $ post ;
$ this -> indexUrl = action ([PostsController::class, ' index ' ]);
}
public function post (): Post
{
return $ this -> post ?? new Post ();
}
public function categories (): Collection
{
return Category:: canBeUsedBy ( $ this -> user )-> get ();
}
}
Ensuite, vous pouvez utiliser la classe de modèle de vue dans votre contrôleur comme ceci :
class PostsController
{
public function create ()
{
$ viewModel = new PostViewModel (
current_user ()
);
return view ( ' blog.form ' , $ viewModel );
}
public function edit ( Post $ post )
{
$ viewModel = new PostViewModel (
current_user (),
$ post
);
return view ( ' blog.form ' , $ viewModel );
}
}
Dans une vue, vous pouvez faire ceci :
< input type = " text " value = " {{ $post -> title } } " />
< input type = " text " value = " {{ $post -> body } } " />
< select >
@foreach ( $categories as $category )
< option value = " {{ $category -> id } } " > {{ $category -> name } } </ option >
@endforeach
</ select >
< a href = " {{ $indexUrl } } " >Back</ a >
Toutes les méthodes et propriétés publiques d'un modèle de vue sont automatiquement exposées à la vue. Si vous ne souhaitez pas qu'une méthode spécifique soit disponible dans votre vue, vous pouvez l'ignorer.
class PostViewModel extends ViewModel
{
protected $ ignore = [ ' ignoredMethod ' ];
/ / …
public function ignoredMethod () { / * … * / }
}
Toutes les méthodes magiques intégrées à PHP sont automatiquement ignorées.
Il est possible de renvoyer directement un modèle de vue depuis un contrôleur. Par défaut, une réponse JSON avec les données est renvoyée.
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return new PostViewModel ( $ post );
}
}
Cette approche peut être utile lorsque vous travaillez avec des formulaires soumis par AJAX.
Il est également possible de retourner directement une vue :
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return ( new PostViewModel ( $ post ))-> view ( ' post.form ' );
}
}
Notez que lorsque l'en-tête Content-Type
de la requête est défini sur JSON, cette approche renverra également des données JSON au lieu d'une vue rendue.
Les modèles de vue peuvent exposer des fonctions qui nécessitent des paramètres supplémentaires.
class PostViewModel extends ViewModel
{
public function formatDate ( Carbon $ date ): string
{
return $ date -> format ( ' Y-m-d ' );
}
}
Vous pouvez utiliser ces fonctions dans la vue comme ceci :
{{ $ formatDate ( $post -> created_at ) } }
Le package comprenait une commande artisanale pour créer un nouveau modèle de vue.
php artisan make:view-model HomepageViewModel
Ce modèle de vue aura l'espace de noms AppViewModels
et sera enregistré dans app/ViewModels
.
ou dans un espace de noms personnalisé, par exemple AppBlog
php artisan make:view-model " Blog/PostsViewModel "
Ce modèle de vue aura l'espace de noms AppBlogViewModels
et sera enregistré dans app/Blog/ViewModels
.
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter CONTRIBUER pour plus de détails.
Si vous avez trouvé un bug concernant la sécurité, veuillez envoyer un mail à [email protected] au lieu d'utiliser le suivi des problèmes.
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.