Newsletter Apprendre Laravel #3

Envoyée le 20 janvier 2019

Déjà la 3e newsletter d'Apprendre Laravel !

Bibliothèque

Aujourd'hui, pour la bibliothèque, on change de Spatie. Je voudrais vous présenter Wink https://wink.themsaid.com/, une bibliothèque qui permet d'ajouter facilement un blog à une application Laravel.

Wink s'installe comme une bibliothèque classique avec Composer. Il suffit de lancer les migrations et de profiter de l'interface d'administration simple et fonctionnelle.

Wink est la parfaite alternative à Wordpress ou Medium pour des blogs simples. Si vous souhaitez commencer un blog, c'est une très bonne solution et rapide à mettre en place.

Personnellement, je pense encore préférer les générateurs de blogs statiques qui permettent d'avoir un site en HTML sans PHP. Si c'est quelque chose qui vous intéresse, il existe Jigsaw https://jigsaw.tighten.co/docs/installation/ qui utilise Blade pour la génération.

Teasing

Taylor Otwell est bien connu pour garder ses projets très secrets (Spark, Nova, Telescope…) et de lancer des petits teasings régulièrement sur Twitter.

Today was a *huge* milestone for me. Was too scared to try it and had to go on call with @adamwathan for moral support. We got lost in some dark bugs for about 3 hours but in the end prevailed. #Laracon #Hopefully

https://twitter.com/taylorotwell/status/1086369193220435968

Cette semaine, il a parlé de Vapor, son futur projet qu'il dévoilera normalement à la Laracon US en juillet. Qu'est-ce que ça sera ? Bonne question ! Tout ce que l'on sait, c'est que l'on peut « Faire fonctionner Vapor via / sur Vapor » :-)

Une citation de @BaseCase sur Twitter

A lot of programmers make the mistake of thinking the way you make code flexible is by predicting as many future uses as possible, but this paradoxically leads to *less* flexible code. The only way to achieve flexibility is to make things as simple and easy to change as you can.

https://twitter.com/BaseCase/status/1085686616499183616

J'en avais déjà parlé dans de nombreuses vidéos, il est impossible de prévoir le futur. Le meilleur moyen de laisser son application évoluer sans problème n'est pas d'essayer de prévoir tous les cas futurs possibles, mais plutôt de développer les fonctionnalités nécessaires aujourd'hui le plus simplement possible afin de laisser la possibilité de modifier ou supprimer du code facilement.

Lorsque le code est complexe avec des classes abstraites utilisées à beaucoup d'endroits, il est souvent plus difficile de modifier ce code sans casser une des classes l'utilisant.

Morceau de code

Un problème qui revient souvent dans les applications Laravel : j'ai un menu dans lequel j'affiche les 3 dernières actualités de mon site. Ce menu est dans une vue menu.blade.php que j'inclus dans mon layout ou dans plusieurs autres vues. Comment faire pour avoir accès à la variable $latest3News dans ma vue menu.blade.php. La solution la plus simple est de dupliquer cette logique dans tous leurs contrôleurs pour passer à chaque fois que nécessaire la variable $latest3News. Mais cela entraîne beaucoup de duplication de code.

Laravel a un système pour régler ce problème : les ViewComposer https://laravel.com/docs/5.7/views#view-composers.

Dans un service provider :

View::composer('menu', function ($view) {
    $latest3News = News::latest()->take(3);

    $view->with('latest3News', $latest3News);
});

À chaque fois que Laravel inclura la vue menu.blade.php dans une autre vue, notre fonction anonyme sera exécutée et la variable ajoutée à la vue menu.blade.php. Cela évite d'avoir à répéter la logique dans tous nos contrôleurs. Le désavantage de cette solution, c'est qu'il est assez compliqué de savoir ce qui se passe lorsque l'on regarde seulement la vue. Il faut savoir qu'un ViewComposer est créé dans un service provider et nous n'avons pas beaucoup d'indication pour le retrouver.

Question de la semaine

Comment charger via eager-load le dernier commentaire d'un article ?

Imaginez que vous avez une relation :

public function commentaires()
{
    return $this->hasMany(Commentaire::class);
}

Rien ne vous empêche de créer une seconde relation pour le dernier commentaire :

public function dernierCommentaire()
{
    return $this->hasOne(Commentaire::class)->latest();
}

// Dans un contrôleur
$articles = Article::with('dernierCommentaire')->get();

Deux choses dans cet exemple. D'une part, les relations n'ont pas besoin d'être uniques dans votre modèle, vous pouvez créer plusieurs relations vers une même entité. D'autre part, vous pouvez ajouter des conditions à votre requête (comme le latest() pour récupérer le dernier commentaire et pas le premier).

Un autre exemple :

public function commentairesValidés()
{
    return $this->hasMany(Comment::class)->where('validé', true);
}

Le principal avantage de cette solution, c'est que l'on peut eager-load ces relations et éviter des requêtes supplémentaires. Le problème, c'est que si l'on a besoin du dernier commentaire et de tous les commentaires validés, nous allons faire deux requêtes avec Article::with('dernierCommentaire', 'commentairesValidés')->get() alors que nous aurions pu en faire une seule en chargeant tous les commentaires et en triant via PHP (même si dans cet exemple, ce n'est pas sûr que cela soit plus performant).

Apprendre Laravel

J'ai travaillé toute la semaine pour un client donc je n'ai pas eu le temps d'avancer sur les articles. J'espère que la semaine prochaine me permettra d'avancer. J'aimerais aussi reprendre les vidéos sur la chaîne YouTube en février. Chaîne YouTube qui va passer les 1000 abonnés la semaine prochaine normalement, merci à tous !

Comme toujours, vous pouvez répondre à ce mail pour me faire vos retours, poser vos questions ou me demander de vous retirer de la liste.

Bon dimanche,

Thibaud