Programmation PHP avec Symfony/Stimulus
Introduction
[modifier | modifier le wikicode]Stimulus est le framework JavaScript officiel de Symfony[1]. Il est installé avec Webpack :
composer require symfony/webpack-encore-bundle
Pour utiliser le framework React.js dans Symfony[2] :
composer require symfony/ux-react
Lancer ensuite npm run watch
pour que le code JS exécuté soit toujours identique à celui écris. Cela va lancer le npm run build
en cours de frappe.
Hello World on ready
[modifier | modifier le wikicode]Partie Twig
[modifier | modifier le wikicode]La première étape consiste à connecter un contrôleur Stimulus depuis un fichier Twig, en lui injectant les variables dont il a besoin. Ex :
<div {{ stimulus_controller('ticket', { subject: 'Hello World' } )}}> </div>
Une syntaxe alternative est :
<div data-controller="ticket" data-ticket-subject-value="Hello World" > </div>
Partie Stimulus
[modifier | modifier le wikicode]Dans le fichier assets/controllers/ticket_controller.js, créer une classe héritant de Stimulus :
import { Controller } from "@hotwired/stimulus"; export default class extends Controller { static values = { subject: String, body: String, }; connect() { alert(this.subjectValue); } }
Rafraichir la page du Twig pour voir le message du code exécuté par Stimulus.
Explication : la fonction connect est un mot réservé désignant une fonction prédéfinie qui s'exécute automatiquement quand le contrôleur Stimulus est connecté au DOM de la page[3]. C'est donc un mécanisme similaire à la méthode magique PHP __contruct. De plus, il existe aussi disconnect comparable à la méthode PHP __destruct.
Si le contrôleur Stimulus est dans un sous-dossier, la syntaxe des séparateurs de dossiers côté Twig n'est pas "/" mais "--".
Ex : stimulus_controller('sousDossier--ticket', ...)
connectera le fichier assets/controllers/sousDossier/ticket_controller.js.
Hello World on click
[modifier | modifier le wikicode]On utilise l'action "click"[4].
Partie Twig
[modifier | modifier le wikicode]<div {{ stimulus_controller('ticket', { subject: 'Hello World' } )}}> <button {{ stimulus_action('ticket', 'onCreate', 'click') }}> Créer un ticket </button> </div>
Une syntaxe alternative est :
<div data-controller="ticket" data-ticket-subject-value="Hello World" > <button data-action="click->ticket#onCreate" > Créer un ticket </button> </div>
Partie Stimulus
[modifier | modifier le wikicode]Par rapport au premier exemple, on remplace juste "connect" par une méthode maison.
import { Controller } from "@hotwired/stimulus"; export default class extends Controller { static values = { subject: String, body: String, }; onCreate() { alert(this.subjectValue); } }
Rafraichir la page du Twig et cliquer sur le bouton pour voir le message du code exécuté par Stimulus.
Exemple où Stimulus appelle React
[modifier | modifier le wikicode]On veut maintenant déclencher l'ouverture d'une fenêtre modale React.js en cliquant sur un bouton de la page du Twig. Il faut donc que le contrôleur Stimulus appelle une classe React.
- ticket_controller.js :
import { Controller } from "@hotwired/stimulus"; import ReactDOM from "react-dom"; import React from "react"; import HelloWorld from "./HelloWorld"; export default class extends Controller { static values = { subject: String, body: String, }; onCreate() { ReactDOM.render(<HelloWorld subject={this.subjectValue} />, this.element); } }
- HelloWorld.js :
export default function (props) { alert(props.subject); }
react_component()
.Références
[modifier | modifier le wikicode]- ↑ https://symfony.com/blog/new-in-symfony-the-ux-initiative-a-new-javascript-ecosystem-for-symfony#symfony-ux-building-highly-interactive-applications-by-leveraging-javascript-giants
- ↑ https://symfony.com/bundles/ux-react/current/index.html
- ↑ https://stimulus.hotwired.dev/reference/lifecycle-callbacks
- ↑ https://stimulus.hotwired.dev/reference/actions