Newsletter Apprendre Laravel #7

Envoyée le 20 mars 2019

Utilisation des bibliothèques externes

Quels sont les avantages à utiliser une bibliothèque externe ? Le principal c'est le gain de temps, ne pas avoir à redévelopper une fonctionnalité déjà développée par quelqu'un d'autre. Un autre avantage c'est la qualité. Lorsque le problème est complexe, un développeur travaillant sur ce sujet pendant longtemps connaît mieux le domaine et son code sera donc plus robuste aux éventuels problèmes.

Mais il y a également des désavantages. Une bibliothèque externe n'est pas conçue exactement pour notre usage, il faut s'adapter à la façon de faire de ses développeurs. Il y a également le temps de compréhension de la documentation, de téléchargement de la bibliothèque et d'éventuelles mises à jour.

Cette réflexion est née d'une nouvelle bibliothèque de Spatie : https://github.com/spatie/laravel-flash. Un message flash est un message qui ne s'affichera que sur la prochaine page affichée et qui disparaîtra à la réactualisation. Par exemple un message de succès lors de la validation d'un formulaire. Cette bibliothèque est une simplification de celle de Jeffrey Way https://github.com/laracasts/flash/. Leur approche est très intelligente : la bibliothèque de Jeffrey est très complète (plusieurs flash sur une seule page, overlay…), dans la plupart de leurs projets, ils n'utilisent pas toutes ces fonctionnalités alors pourquoi ne pas créer une bibliothèque plus simple répondant au besoin.

Maintenant, la bibliothèque de Spatie est une simplification d'une bibliothèque peu complexe. Sachant que le mécanisme temporel du flash est déjà géré par Laravel via les sessions : en écrivant session()->flash('message', 'Formulaire envoyé !'), la clé message dans la session ne sera disponible que sur la page suivante et disparaîtra automatiquement ensuite. Pourquoi ne pas coder nous-même notre système de flash ? Je me suis livré à l'exercice et le résultat tient en 15 lignes de code.

Dans un fichiers helpers.php :

function flash_success($message)
{
    session()->flash('flash_message', $message);
    session()->flash('flash_class', 'alert-success');
}

function flash_error($message)
{
    session()->flash('flash_message', $message);
    session()->flash('flash_class', 'alert-danger');
}

Dans notre layout Blade :

@if (session()->has('flash_message'))
    <div class="alert {{ session('flash_class') }}>
        {{ session('flash_message') }}
    </div>
@endif

C'est une solution très simple au problème qui ne demande que quelques minutes à développer. L'avantage c'est la maîtrise total de la solution : vous ne souhaitez pas utiliser des fonctions PHP ? Créez une classe à la place. Vous souhaitez avoir d'autres types de flash ou des types dynamiques ? Vous pouvez changer le code.

Les fonctions en PHP

Depuis l'apparition des objets en PHP, nous avons tendance à les voir comme une amélioration des fonctions alors que ce sont simplement des concepts différents. Comme je l'ai présenté dans la dernière newsletter, de nombreuses personnes développe des applications complexes sans objet, avec uniquement des fonctions.

L'avantage des fonctions c'est qu'elles sont faciles à comprendre : des paramètres en entrés, une valeur de retour et c'est tout. Pas besoin d'importer la fonction en haut du fichier, pas besoin d'appeler le constructeur avec certains paramètres puis la méthode avec d'autres…

Vous pouvez très simplement ajouter des fonctions à votre projet Laravel via un Service Provider :

public function boot()
{
    require_once(base_path('app/helpers.php'));
}

Ou via l'autoload de Composer dans votre composer.json :

"autoload": {
    …
    "files": [
        "app/helpers.php"
    ]
},

Ici j'utilise un fichier unique helpers.php mais vous pouvez bien évidemment regrouper vos fonctions dans différents fichiers. Cela ne veut pas dire qu'il ne faut plus utiliser d'objet, c'est simplement une autre option dans vos développements qui vaut le coup d'être considérée.

Short Arrow Function

On reste sur le thème des fonctions avec les fonctions anonymes cette fois. En PHP, les fonctions anonymes sont assez verbeuses à écrire pour deux raisons : premièrement le mot-clé function long à écrire, et deuxièmement l'obligation d'utiliser les use() pour accéder aux variables définies à l'extérieur de la fonction.

$selected_emails = ['thibaud@formation-laravel.fr', 'foo@example.org'];

$users->filter(function ($user) use ($selected_emails) {
    return in_array($user->email, $selected_emails);
});

Nikita Popov vient de proposer à nouveau une modification du langage afin d'introduire des fonctions anonymes courtes de la même manière que JavaScript peut le faire.

$selected_emails = ['thibaud@formation-laravel.fr', 'foo@example.org'];

$users->filter(fn($user) => in_array($user->email, $selected_emails))

Si cette proposition est acceptée pour PHP 7.4, cela simplifiera grandement l'usage des collections avec Laravel (avec toutes les fonctions anonymes nécessaire à map, filter, first, contains…) et rendra peut-être même moins utile l'utilisation des "High Order Proxy" :

$users->map->accounts();
$users->map(fn($user) => $user->accounts());

Voilà pour cette nouvelle newsletter, j'espère qu'elle aura été intéressante pour vous et je vous donne rendez-vous la semaine prochaine une nouvelle édition !

Thibaud