--- id: Guiziweb/guiziweb-plugins/plugin-add-stimulus-controller version: "63a2a59e" license: MIT install: manual updated: 2026-06-22 --- # plugin-add-stimulus-controller — This skill scaffolds a Stimulus controller for Sylius plugins, creating the JS file and syncing declarations across package.json and controllers.json. It handles both admin and shop contexts with configurable lazy or eager loading modes. Publisher: Guiziweb · Stars: 4 · Updated: 2026-06-22 Install (manual): `git clone https://github.com/Guiziweb/guiziweb-plugins` ## SKILL.md # Add a Stimulus Controller to a Sylius Plugin Ask the user for ControllerName, target (admin/shop), and fetch mode (lazy/eager) if not provided. --- ## Context — how it works in a plugin In a **Sylius application**, controllers in `assets/controllers/` are auto-discovered. In a **Sylius plugin**, controllers are declared as an npm package. The test application installs the plugin via `"@vendor/my-plugin": "file:../../.."` in its `package.json`. The stimulus-bridge resolves controller files by reading `symfony.controllers` from the plugin's `package.json`. Two files must be in sync: - `package.json` → declares the controller and its JS file path - `assets/{admin|shop}/controllers.json` → enables it and sets fetch mode --- ## 1. Create the JS controller `assets/{admin|shop}/controllers/{ControllerName}Controller.js` ```javascript import { Controller } from '@hotwired/stimulus'; export default class extends Controller { // expose methods as actions (called via data-action="event->controller#method") myAction() { // ... } } ``` **Stimulus conventions:** - No `addEventListener` in `connect()` — use `data-action` attributes in templates instead - Values: `static values = { myParam: String }` → accessed via `this.myParamValue` - Targets: `static targets = ['myEl']` → accessed via `this.myElTarget` --- ## 2. Declare in `package.json` Add under `symfony.controllers` in the plugin root `package.json`: ```json { "name": "@vendor/my-plugin", "symfony": { "controllers": { "my-controller": { "main": "assets/admin/controllers/MyControllerController.js", "fetch": "eager" } } } } ``` - `fetch: "eager"` → loaded on every page (needed if controller must be ready before user interaction, e.g. on modal open) - `fetch: "lazy"` → loaded only when the controller appears in the DOM > **Do NOT add `"webpackMode": "lazy"` for eager controllers** — it conflicts. --- ## 3. Enable in `assets/{admin|shop}/controllers.json` ```json { "controllers": { "@vendor/my-plugin": { "my-controller": { "enabled": true, "fetch": "eager" } } }, "entrypoints": [] } ``` The fetch mode here must match `package.json`. --- ## 4. Use in a Twig template ```twig