[Laravel] View Composers ou partager des données dans plusieurs vues.

lundi 4 juin 2018

Nous allons voir ici comment ne pas devoir toujours passer certaines données de nos controllers vers nos vues et donc d’éviter la duplication de code.

En effet, il peut être très utile de ne passer qu’une seule fois un paramètre commun à plusieurs partie de template ou templates.
un très bon exemple serait une liste des derniers articles dans un menu ou sur la partie sidebar de notre site Internet.

Pour se faire, il existe la technique de View Composer qui va permettre de ne pas dupliquer par exemple la fonction qui va recherche les nouveaux articles et les assigner à chaque vue qui devra l’afficher. Par exemple, on aurait trois pages (home/articles/contact/), on devrait définir dans chaque controller de chaque route un appel vers la fonction qui va rechercher les derniers articles et les passer à la vue via la fonction with de l’objet view !

Pour cette technique nous allons créer un fichier SideBarComposer sous le répertoire app/Http/Composers.

namespace App\Http\Composers;

use Illuminate\View\View;
use App\Articles;

class SideBarComposer {

  public function compose(View $view){
    $view->with('$articles',Articles::All());
  }
}

Dans ce cas-ci, nous retournerons toujours une variable $artciles.
Cette classe va donc retourner le paramètre commun à tout nos templates dont nous avons besoin.

Maintenant, nous devons créer un Service Provider qui permettra de rajouter la dépendance à cette classe Composer au démarrage de notre application et aussi de définir à quelle vue ou partie de vue on souhaites exécuter cette partie de code.

php artisan make:provider SideBarComposerServiceProvider

Cette commande permettra de créer le service provider avec les fonctions nécessaire à sa déclaration (boot() et register()).
Pour rappel un service provider permet d’exécuter du code au démarrage de votre application via la fonction boot() et de rajouter des dépendances à votre application via la fonction register().

    public function register()
    {
      view()->composer('layouts.sidebar','App\Http\Composers\ProfileMenuComposer');
    }

Dans notre cas, nous allons rajouter une dépendance à notre objet SideBarComposer pour la partie de vue se trouvant dans ressources/views/layouts/sidebar.blade.php.

N’oubliez pas non plus comme pour tout Service provider, il est impératif de définir cette classe à Laravel via la propriété providers du fichier config/app.php

...
'providers' => [
   ...
   App\Providers\SideBarComposerServiceProvider::class,
   ...

Et donc maintenant dans notre vue layouts.sidebar, nous pourrons avoir accès à la variable $articles défini dans le SideBarComposer.

Tags: Composer , Laravel , ServiceProvider , views