Fabrice Planchette

Créer une macro sous Laravel

May 12, 2021

Les macros Laravel permettent d’ajouter ses propres méthodes à une classe interne à Laravel.

Macroable ?

Dans certaines classes “core” de Laravel, un trait est injecté : use Macroable;. Tu le trouveras par exemple dans les classes Collection, Request, Redirect, … et pleins d’autres. Ce trait va te permettre de créer tes propres méthodes.

Exemple avec Redirect

Prend par exemple la classe Redirect. Elle dispose d’une méthode with qui permet d’assigner une variable qui sera disponible sur la page de redirection.

return redirect('/')->with('status', 'Well done.');

Ok, et si on souhaite rajouter une notion de type, pour que côté front on puisse différencier un message de succès (et le mettre en vert), d’un message d’alerte (et le mettre un rouge, oui ils sont comme ça les devs front). Tu me vois venir ?

return redirect('/')->with('status', 'Well done.')->with('status_type', 'success');

Voilà, on châine, ça marche mais c’est pas beau. L’idéal serait de pouvoir écrire ça :

return redirect('/')->alert('success', 'Well done.');

Non ?

Cherche pas, la réponse est OUI !

Donc c’est là qu’on parle de macro. Pour enregistrer notre méthode alert, ça se passe dans la méthode boot() d’un service provider (AppServiceProvider ira très bien) :

Redirect::macro('alert', function(string $type, string $message) {
    return $this->with('status', $message)->with('status_type', $type);
});

C’est pas beautiful ?

Exemple avec Filesystem

Un autre exemple ? Extraire un fichier zip, ca prend 4 lignes :

$zip = new ZipArchive();
$zip->open($path);
$zip->extractTo($extractTo);
$zip->close();

Si t’es comme moi, t’as envie d’écrire ça en une seule ligne non ?!

File::extractZip($path, $extractTo);

Et bien, il me suffit d’écrire la macro suivante :

Filesystem::macro('extractZip', function (string $path, string $extractTo) {
    $zip = new ZipArchive();
    $zip->open($path);
    $zip->extractTo($extractTo);
    $zip->close();
});

Allez, je te laisse taper “Laravel macro” dans ton moteur de recherche préféré et tu devrais tomber sur d’autres exemples ;)