Laravel : utilisation de compact dans un contrôleur vers une vue

Je vais vous proposer un nouveau tutoriel sur le framework Laravel, car avant de proposer une page complète, j’aimerais bien essayer de couvrir le maximum de sujet. On va cette fois parler de la très classique architecture MVC de Laravel. Ce tutoriel va se concentrer plus particulièrement le contrôleur et la vue. J’ai déjà vu cette question apparaître plusieurs fois sur les forums et on me l’a posé dans le cadre professionnel donc je me suis dit, autant vous faire une belle page qui couvre le sujet.

Pour illustrer cette application, je vais imaginer une fonction la plus simpliste possible qui va récupérer le contenu d’un article de blog via un modèle. Si vous n’êtes encore très à l’aise avec les modèles de Laravel ou que vous êtes encore en train d’apprendre le framework, je vous conseille d’aller voir cet article qui explique le fonctionnent des modèles sur Laravel. Bien évidemment, étant donné que cette fonction se veut le plus simple possible, je passerai sur quelques étapes comme des vérifications, la sécurité, le but, c’est vraiment d’illustrer comment utiliser la fonction PHP compact() pour passer les données du contrôleur à la vue. Concernant la sécurité, n’oubliez pas d’aller faire un tour sur mon tutoriel pour gérer les middleware avec des rôles dans Laravel.

La fonction pour récupérer l’article de blog

Il s’agit d’une fonction toute simple dans mon contrôleur qui va aller chercher via les modèles les différentes informations de mon article ainsi que sa catégorie et son auteur qui sont stockés dans 3 tables différentes dans ma base de données. Ces tables ont bien évidemment été créées à l’aide des migrations qui sont un outil indispensable du framework Laravel.

Voici le code de cette fonction de base qui va appeler ma vue blade pour afficher la page d’un article :

public function showArticle($articleId)
{
    // Simulation de la récupération des données de l'article 
    // depuis une base de données
    $article = Article::find($articleId);

    // Récupération des données de la catégorie
    $category = Category::find($article->category_id);

    // Récupération des données de l'auteur
    $author = Author::find($article->author_id);

    // Création un tableau associatif avec 
    // les données à transmettre à la vue
    $data = [
        'article' => $article,
        'category' => $category,
        'author' => $author,
    ];

    // Renvoyer la vue avec le tableau associatif de données
    return view('article.show', $data);
}

Bien sûr, il faudrait par exemple gérer le cas ou l’id de l’article n’existe pas, mais ce n’est pas ce qui nous intéresse ici. Je veux faire le plus court possible pour montrer la différence avec la fonction compact() que l’on va voir ensuite. Dans notre vue, il va donc falloir le code suivant pour afficher les différentes informations :

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>{{ $data['article']->title }}</h1>
    <p>{{ $data['article']->content }}</p>
    <p><strong>Categorie :</strong> {{ $data['category']->name }}</p>
    <p><strong>Auteur :</strong> {{ $data['author']->name }}</p>
</div>
@endsection

En soit, il n’y a aucun problème ou d’erreurs, ça fonctionne parfaitement, mais des choses me dérangent un peu. Du côté du controller ça manque un peu d’élégance et dans la vue, je trouve que la lisibilité est un peu moins bonne, c’est moins « joli ». Alors clairement, dans ce tutoriel, on ne va pas trop le ressentir. Par contre dans un controlleur qui est un plus compliqué qui renvoie beaucoup d’informations sur une vue beaucoup plus complexe, ça peut vite devenir moins agréable à manipuler.

Utiliser with plutôt qu’un tableau associatif pour faire le lien entre le controller et la vue

Quand j’ai commencé avec le framework Laravel, il s’agissait, si ma mémoire est bonne, de la version 5 avec son lot de chamboulement à l’époque. Ce qui était préconisé et indiqué dans la documentation officielle du framework, c’était d’utiliser la fonction with(). On a déjà quelque chose d’un peu plus élégant pour envoyer nos données du contrôleur à la vue :

public function showArticle($articleId)
{
    $article = Article::find($articleId);
    $category = Category::find($article->category_id);
    $author = Author::find($article->author_id);

    return view('article.show')
    ->with('article', $article)
    ->with('category', $category)
    ->with('author', $author);
}

Pour exploiter ces data dans notre vue, on arrive sur quelque chose qui est déjà un peu plus sympathique et surtout cohérent plutôt que d’aller piocher dans un énorme tableau si le cas se produit. Notre vue se transforme alors un peu et les variables que l’on va utilise sont beaucoup plus lisibles :

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>{{ $article->title }}</h1>
    <p>{{ $article->content }}</p>
    <p><strong>Categorie :</strong> {{ $category->name }}</p>
    <p><strong>Auteur :</strong> {{ $author->name }}</p>
</div>
@endsection

Utilisation de la fonction compact() dans le contrôleur

L’utilisation de la fonction with() est déjà une belle amélioration et a rendu les variables de notre vue plus cohérentes, mais il est possible d’aller encore un peu plus loin sur la partie contrôleur. Je peux encore gagner en lisibilité du code sans perdre en maintenabilité. Pour remédier à ça, je vais utiliser la fonction compact() qui est nativement présente dans le langage de programmation php. À l’époque, avant de faire du Laravel, disons sur du php plus vanilla, j’ai très peu utilisé cette fonction alors que pourtant elle existe depuis très longtemps. À présent, c’est devenu un réflexe quand c’est vraiment pertinent. J’étais aussi plus jeune …

Depuis laravel 7 et les versions suivantes, compact fonctionne parfaitement pour passer les informations du controller à la vue. En utilisant compact(), le code de mon controller va maintenant ressembler à ceci :


public function showArticle($articleId)
{
    $article = Article::find($articleId);
    $category = Category::find($article->category_id);
    $author = Author::find($article->author_id);
    return view('article.show', compact('article', 'category', 'author'));
}

Pas mal non ? Le code de la vue lui ne change pas par rapport à ce que nous avons vu juste au-dessus avec la fonction with dans Laravel. Pour vos futurs projets avec le framework Laravel, j’espère que cette utilisation judicieuse de la fonction compact() vous sera utile pour optimiser la lisibilité de votre code. C’est une fonction claire qui fait bien les choses sans pour autant que ça devienne compliqué pour ceux qui pourraient passer après vous. J’espère que ça vous sera utile !

Laisser un commentaire