Il y a peu, j’ai découvert Laravel, un framework qui devrait être considéré d’utilité publique de par sa souplesse, facilité d’apprentissage, d’utilisation et un atout indéniable, sa communauté très large.
J’ai profité de la refonte de mon outil de gestion de bibliothèque pour m’y mettre et je peux vous dire que je n’ai pas été déçu. J’ai donc décidé de vous faire partager quelques points, qui me semblent intéressants et qui m’ont été utiles lors du développement de mon projet.
J’ai donc eu besoin de créer des URLs SEO Friendly grâce à des slugs, comme ceux que l’on peut trouver par défaut sur WordPress. Par défaut, les URLs de vos modèles Laravels sont uniquement constituées des ID de votre modèle (hormis les endpoints utilisés par défaut : edit, create, etc.).
Pour la fonction show de mon controller Book, je voulais avoir une URL constitué de l’ID de mon livre ainsi qu’un slug généré automatiquement à partir du titre. Voici ce que l’on souhaite obtenir :
https://www.mondomaine.com/book/1/book-title
Pour cet article, je vais partir de mon exemple, c’est à dire une classe Book composée d’un id ainsi qu’un attribut title. Pour faire simple, le slug sera une version « slugifiée » du titre de mon livre.
Table des matières
Création du slug
Dans un premier temps, nous allons créer l’attribut slug pour notre livre comme suit :
[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Ause%20Illuminate%5CDatabase%5CEloquent%5CModel%3B%0A%0Aclass%20Book%20extends%20Model%0A%7B%0A%20%20%20%20public%20function%20getSlugAttribute()%3A%20string%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20str_slug(%24this-%3Etitle)%3B%0A%20%20%20%20%7D%0A%7D » message= » » highlight= » » provider= »manual »/]
Gestion de la route
Dans votre fichier de routes, web.php, le format d’URL que nous désirons ressemble donc à ceci :
[pastacode lang= »php » manual= »Route%3A%3Aget(‘%2Fbook%2F%7Bid%7D%2F%7Bslug%3F%7D’%2C%20’BookController%40show’)-%3Ename(‘book.show’)%3B » message= » » highlight= » » provider= »manual »/]
Pour nous simplifier la vie, je rends le paramètre slug non obligatoire dans ma route. Dans un premier temps, je ne l’utiliserai pas dans mon controller.
Gestion du Controller
Dans le BookController, rien ne change vraiment. Nous ne prenons que l’ID en compte, comme avant la mise en place du slug.
[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Ause%20App%5CModels%5CBook%3B%0A%0Aclass%20BookController%0A%7B%0A%20%20%20%20public%20function%20show(%24id)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20view(‘book.show’)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%3EwithBook(Book%3A%3AfindOrFail(%24id))%3B%0A%20%20%20%20%7D%0A%7D%0A » message= » » highlight= » » provider= »manual »/]
Utiliser votre URL SEO Friendly
Désormais, dans vos templates Blade, vous pouvez générer une URL SEO Friendly pour accéder à la vue de votre objet Book.
[pastacode lang= »php » manual= »%7B%7B%20route(‘book.show’%2C%5B%24book-%3Eid%2C%20%24book-%3Eslug%5D)%7D%7D » message= » » highlight= » » provider= »manual »/]
Pour aller plus loin
Si vous ne souhaitez pas en rester là, je vous propose quelques petits bouts de codes supplémentaires 😉
Générer un attribut URL pour votre modèle
Il peut s’avérer utile d’avoir, directement dans votre objet un attribut url contenant l’URL complète et déjà générée menant à la vue de l’objet.
[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Aclass%20Book%20extends%20Model%0A%7B%0A%20%20%20%20%2F%2F%20…%0A%0A%20%20%20%20public%20function%20getUrlAttribute()%3A%20string%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20action(‘BookController%40show’%2C%20%5B%24this-%3Eid%2C%20%24this-%3Eslug%5D)%3B%0A%20%20%20%20%7D%0A%09%0A%09%2F%2F%20…%0A%7D » message= » » highlight= » » provider= »manual »/]
Vous pouvez désormais utiliser l’attribut $book->url dans vos vues Blade ou directement dans le PHP de votre projet.
Éviter le contenu dupliqué
Avec la création de slugs pour votre objet, il se peut que vous ayez plusieurs URLs pour une même entité. Soit car vous avez encore des liens sans slugs qui se baladent sur votre site ou alors, un slug mal formé. Pour résoudre ce problème, je vous propose deux solutions, soit rediriger automatiquement vers la bonne page si le slug ne s’avère pas être le bon, ou bien en mettant en place une balise canonical.
Redirection automatique
Pour rediriger automatiquement une mauvaise URL, je vous propose de vérifier si le slug donné dans l’URL correspond au slug généré par notre attribut ajouté plus haut. Si le slug ne correspond pas, nous redirigeons automatiquement vers la bonne URL.
[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Ause%20App%5CModels%5CBook%3B%0A%0Aclass%20BookController%0A%7B%0A%20%20%20%20public%20function%20show(%24id%2C%20%24slug%20%3D%20 »)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%24book%20%3D%20Book%3A%3AfindOrFail(%24id)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(%24slug%20!%3D%3D%20%24book-%3Eslug)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20redirect()-%3Eto(%24book-%3Eurl)%3B%20%0A%09%09%09%2F%2F%20Vous%20pouvez%20utiliser%20%C3%A9galement%20redirect()-%3Eto(%24book-%3Eurl%2C%20301)%3B%20%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20view(‘book.show’)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%3EwithBook(%24book)%3B%0A%20%20%20%20%7D%0A%7D%0A » message= » » highlight= » » provider= »manual »/]
Générer une balise canonical
Certains n’aiment pas les redirections et préféreraient une solution plus douce, via la mise en place d’une balise canonical.
Pour rappel, voici ce qu’est une balise canonical
Une Balise Canonical sert à indiquer aux moteurs de recherche comme Google ou Bing le fait qu’une page web est dupliquée et reprend le contenu d’un autre document. Cette balise contient alors l’adresse de la page originale, appelée canonique.
Citation issue du site Définitions SEO
Passons au code. Dans un premier temps, il vous faut ajouter une balise canonical (seulement si elle existe) dans votre fichier de layout, par défaut : app.blade.php
[pastacode lang= »markup » manual= »…%0A%20%20%3Chead%3E%0A%20%20%20%20%40if(isset(%24canonical))%0A%20%20%20%20%3Clink%20rel%3D%22canonical%22%20href%3D%22%7B%7B%20%24canonical%20%7D%7D%22%20%2F%3E%0A%20%20%20%20%40endif%0A%20%20%3C%2Fhead%3E%0A…%0A » message= » » highlight= » » provider= »manual »/]
Dans votre controller, il faut désormais ajouter le passage de la balise canonical à la vue, comme ceci
[pastacode lang= »php » manual= »%3C%3Fphp%0A%0Ause%20App%5CModels%5CBook%3B%0A%0Aclass%20BookController%0A%7B%0A%20%20%20%20%2F%2F%20…%0A%20%20%20%20public%20function%20show(%24id%2C%20%24slug%20%3D%20 »)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%24book%20%3D%20Book%3A%3AfindOrFail(%24id)%3B%0A%0A%20%20%20%20%20%20%20%20return%20view(‘book.show’)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%3EwithBook(%24book)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%3EwithCanonical(%24book-%3Eurl)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20… » message= » » highlight= » » provider= »manual »/]
Voilà, vous avez désormais une page accessible depuis une URL clairement plus lisible et plus SEO Friendly pour vos modèles Laravel. N’hésitez pas si vous avez des suggestions à me proposer ou des corrections, je suis preneur 😉
Image à la une : lmonk72 / Pixabay