Laravel & Storyblok : activation de l'éditeur visuel en temps réel

DEV - 05/02
Cet article présente une approche avisée mais efficace pour intégrer Laravel à Storyblok,...

Cet article présente une approche avisée mais efficace pour intégrer Laravel à Storyblok, en se concentrant sur les décisions pratiques qui débloquent une expérience d'édition visuelle en temps réel.

Lorsque l’on pense aux intégrations CMS sans tête avec édition visuelle en temps réel, des frameworks comme React, Vue ou Next.js viennent généralement à l’esprit. Mais et si je vous disais que les modèles Laravel avec Blade peuvent offrir la même expérience d'édition visuelle transparente ?

Dans cet article, je vais vous expliquer comment intégrer l'éditeur visuel de Storyblok à Laravel, avec des mises à jour d'aperçu en temps réel et une comparaison intelligente du DOM pour éliminer le scintillement. Aucun framework JavaScript requis.

Pourquoi Laravel + Storyblok ?

Avant de plonger dans le code, abordons l'éléphant dans la pièce : « Storyblok n'est-il pas conçu pour les frameworks JavaScript ?

Pas du tout. Storyblok est indépendant du framework. Alors que la documentation la plus courante met l'accent sur React et Vue, les API sous-jacentes fonctionnent avec n'importe quelle technologie qui peut :

  1. Récupérer JSON à partir d'une API
  2. Rendre le HTML
  3. Exécutez JavaScript dans le navigateur

Laravel excelle dans les trois. De plus, vous obtenez :

  • Rendu côté serveur prêt à l'emploi (idéal pour le référencement et le géolocalisation)
  • Syntaxe de modèle élégante de Blade
  • Aucun problème d'hydratation (un problème courant avec les cadres SSR)
  • Déploiement plus simple par rapport aux applications Node.js (mais c'est mon avis basé sur mon expérience personnelle, probablement si vous êtes un ingénieur devop avec des compétences Node, vous penserez différemment)

Mais voici mon avis. Prêt?

Il y a une raison pour laquelle Laravel continue de gagner.

Il ne s’agit pas seulement d’une syntaxe élégante ou d’une bonne documentation. Il s'agit de l'écosystème. Laravel est devenu une plate-forme complète pour créer des applications évolutives de qualité production, avec des packages de première classe pour presque tout ce dont vous avez besoin.

Plus précisément, pour les interfaces basées sur le contenu, vous disposez de composants Blade qui s'affichent rapidement et se déploient n'importe où. Mais voici ce qui manque à la plupart des développeurs : Laravel est désormais une plate-forme sérieuse pour l'intégration de l'IA. Des bibliothèques comme Laravel AI et Neuron AI vous permettent de créer des agents intelligents, de vous connecter aux LLM et d'ajouter des fonctionnalités basées sur l'IA sans quitter l'écosystème que vous connaissez déjà. Et avec NativePHP, vous pouvez publier des applications de bureau et mobiles natives en utilisant la même base de code Laravel.

Laravel ne sert pas uniquement à créer des sites Web. Il s'agit de créer des canaux tels que des kiosques, des applications mobiles, des assistants basés sur l'IA et tout le reste.

Cela est important pour ce que nous sommes sur le point de construire. Une intégration CMS sans tête ne se limite pas au rendu des pages. Il s'agit de créer une couche de contenu capable d'alimenter votre site Web aujourd'hui, votre application mobile demain et votre agent IA le mois prochain. Laravel gère tout cela.

Parlons maintenant de l'édition visuelle.

L'architecture

Voici comment fonctionne l'intégration :

┌───────────────────────────────── ─────────────────────────────────┐ │ Storyblok CMS │ │ ┌────────────────────┐ │ │ │ Éditeur visuel │ │ │ └─────────┬──────────┘ │ │ ┌──────┴──────┐ │ │ URL d'aperçu Événements en temps réel │ │ │ │ │ └───────────────────────┼───────── ────┼────────────────────────────┘ │ │ ▼ ▼ ┌───────────────────────────────── ─────────────────────────────────┐ │ Application Laravel │ │ │ │ ┌───────────────────┐ ┌───────────────────────────┐ │ │ │ StoryController │ │ Storyblok Bridge │ │ │ │ POST /api/preview│ │ (JavaScript) │ │ │ └─────────┬─────────┘ └─────────────┬─────────────┘ │ │ │ │ │ │ │ ┌────────────────────────┘ │ │ │ │ fetch('/api/preview') │ │ │ │ + DOM idiomorphe différent │ │ ▼ ▼ │ │ ┌───────────────────────────── ──────────────────────────────┐ │ │ │ Composants de la lame │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ │ │section héros │ │ carte quadrillée │ │ image (responsive) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ │ │ ...
[Courte citation de 8% de l'article original]
Loading...