[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSZEJ3BNHCNZT18SYFGDME":3,"skill-same:01M6CSZEJ3BNHCNZT18SYFGDME":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":14,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M6CSZEJ3BNHCNZT18SYFGDME","symfony:message",null,"Genere un Message Symfony Messenger avec son Handler pour traitement asynchrone","atournayre\u002Fclaude-personas","atournayre","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F4262077?v=4","01M6CSSGYW0E0D0M3E2T6J9X2Z","Aurélien Tournayre","01M6CSSH3DENJF2XWZ41H0F43K",0,"MIT","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmessage\u002FSKILL.md",[],[19,5,20,21,22,23,24],"message","Bash","grep","read","write","edit","2026-11-10 10:12:30",false,"---\nname: symfony:message\ndescription: Genere un Message Symfony Messenger avec son Handler pour traitement asynchrone\nmodel: sonnet\nallowed-tools: [AskUserQuestion, Bash, Read, Write, Edit, Grep, Glob]\nversion: 1.0.0\nlicense: MIT\n---\n\n# Symfony Messenger Skill\n\nGenere un Message et son MessageHandler pour le composant Symfony Messenger (traitement synchrone ou asynchrone).\n\n## Variables\n- **{MessageName}** - Nom du message en PascalCase (ex: SendWelcomeEmail)\n- **{namespace}** - Namespace du projet (defaut: App)\n\n## Outputs\n- `src\u002FMessage\u002F{MessageName}.php`\n- `src\u002FMessageHandler\u002F{MessageName}Handler.php`\n\n## Instructions a Executer\n\n**IMPORTANT : Execute ce workflow etape par etape :**\n\n### 1. Demander le nom du message\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel est le nom du message ? (ex: SendWelcomeEmail, ProcessOrder, GenerateReport)\"\n  Header: \"Message\"\n  ```\n- Stocke dans MessageName\n\n### 2. Demander les proprietes du message\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quelles donnees porte le message ? Format: userId:int,email:string,orderId:string (laisser vide si aucune)\"\n  Header: \"Donnees\"\n  ```\n\n### 3. Demander le type de transport\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel transport pour ce message ?\"\n  Header: \"Transport\"\n  Options:\n    - \"async (Recommande)\" : \"Traitement asynchrone via le transport par defaut (doctrine, redis, amqp...)\"\n    - \"sync\" : \"Traitement synchrone immediat\"\n    - \"failed\" : \"Recu depuis la file d'erreurs (pour retraitement)\"\n  ```\n\n### 4. Demander les options avancees\n\n- Utilise AskUserQuestion (multiSelect: true) pour demander :\n  ```\n  Question: \"Quelles options activer ?\"\n  Header: \"Options\"\n  Options:\n    - \"Stamps\" : \"Ajouter des stamps personnalises (metadata sur le message)\"\n    - \"Middleware\" : \"Generer un middleware pour ce type de message\"\n    - \"Retry strategy\" : \"Configurer la strategie de retry en cas d'echec\"\n  ```\n\n### 5. Detecter le namespace du projet\n\n- Lis `composer.json` avec Read\n- Extrais le namespace depuis `autoload.psr-4`\n- Si non trouve, utilise `App` par defaut\n\n### 6. Generer la classe Message\n\n- Cree le fichier `src\u002FMessage\u002F{MessageName}.php` avec Write\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Message;\n\nfinal class {MessageName}\n{\n    public function __construct(\n        private readonly int $userId,\n        private readonly string $email,\n    ) {\n    }\n\n    public function getUserId(): int\n    {\n        return $this->userId;\n    }\n\n    public function getEmail(): string\n    {\n        return $this->email;\n    }\n}\n```\n\n**Regles de generation :**\n- Classe `final`, pas d'heritage, pas d'interface\n- Proprietes `private readonly` via promoted constructor\n- Getters pour chaque propriete\n- Pas de setters (message immuable)\n- Pas d'injection de services (un message est un simple DTO)\n- Les proprietes doivent etre serialisables (scalaires, tableaux, objets simples)\n\n### 7. Generer le MessageHandler\n\n- Cree le fichier `src\u002FMessageHandler\u002F{MessageName}Handler.php` avec Write\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\MessageHandler;\n\nuse {namespace}\\Message\\{MessageName};\nuse Symfony\\Component\\Messenger\\Attribute\\AsMessageHandler;\n\n#[AsMessageHandler]\nfinal class {MessageName}Handler\n{\n    public function __construct(\n        \u002F\u002F Injecter les services necessaires\n    ) {\n    }\n\n    public function __invoke({MessageName} $message): void\n    {\n        \u002F\u002F Logique de traitement\n        \u002F\u002F $message->getUserId()\n        \u002F\u002F $message->getEmail()\n    }\n}\n```\n\n**Regles de generation :**\n- Classe `final` avec attribut `#[AsMessageHandler]`\n- Methode `__invoke()` avec le message en parametre\n- Injection de dependances via constructeur\n- Retour `void` par defaut (sauf si query avec retour)\n\n### 8. Generer le middleware (si demande)\n\n- Cree le fichier `src\u002FMessenger\u002FMiddleware\u002F{MessageName}Middleware.php` avec Write\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Messenger\\Middleware;\n\nuse Symfony\\Component\\Messenger\\Envelope;\nuse Symfony\\Component\\Messenger\\Middleware\\MiddlewareInterface;\nuse Symfony\\Component\\Messenger\\Middleware\\StackInterface;\n\nfinal class {MessageName}Middleware implements MiddlewareInterface\n{\n    public function handle(Envelope $envelope, StackInterface $stack): Envelope\n    {\n        \u002F\u002F Logique avant traitement\n\n        $envelope = $stack->next()->handle($envelope, $stack);\n\n        \u002F\u002F Logique apres traitement\n\n        return $envelope;\n    }\n}\n```\n\n### 9. Afficher le resume\n\nAffiche :\n```\nMessage {MessageName} genere avec succes\n\nFichiers crees :\n- src\u002FMessage\u002F{MessageName}.php\n- src\u002FMessageHandler\u002F{MessageName}Handler.php\n\nDispatch du message :\n  $this->messageBus->dispatch(new {MessageName}($userId, $email));\n\nConfiguration du routing (config\u002Fpackages\u002Fmessenger.yaml) :\n  framework:\n      messenger:\n          routing:\n              '{namespace}\\Message\\{MessageName}': async\n\nProchaines etapes :\n- Implementer la logique dans le handler\n- Configurer le routing dans messenger.yaml\n- Lancer le worker : php bin\u002Fconsole messenger:consume async\n```\n\n## Patterns appliques\n\n### Message\n- Simple DTO immuable (pas de service, pas d'interface)\n- Constructeur avec promoted properties readonly\n- Serialisable (pas d'objets complexes comme des entites Doctrine)\n\n### Handler\n- `#[AsMessageHandler]` attribut (Symfony 6.2+)\n- Methode `__invoke()` invocable\n- Injection de services via constructeur\n\n### Middleware\n- Implements `MiddlewareInterface`\n- Pattern decorator : appeler `$stack->next()->handle()`\n\n## Notes\n- Un message ne doit contenir que des identifiants (pas des entites Doctrine entieres)\n- Preferer `#[AsMessageHandler]` a l'interface `MessageHandlerInterface`\n- Le routing (sync\u002Fasync) se configure dans `messenger.yaml`, pas dans le code\n- Utiliser `messenger:consume` pour lancer le worker\n- Configurer les retries dans `messenger.yaml` sous `failure_transport`\n","# Symfony Messenger Skill\n\nGenere un Message et son MessageHandler pour le composant Symfony Messenger (traitement synchrone ou asynchrone).\n\n## Variables\n- **{MessageName}** - Nom du message en PascalCase (ex: SendWelcomeEmail)\n- **{namespace}** - Namespace du projet (defaut: App)\n\n## Outputs\n- `src\u002FMessage\u002F{MessageName}.php`\n- `src\u002FMessageHandler\u002F{MessageName}Handler.php`\n\n## Instructions a Executer\n\n**IMPORTANT : Execute ce workflow etape par etape :**\n\n### 1. Demander le nom du message\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel est le nom du message ? (ex: SendWelcomeEmail, ProcessOrder, GenerateReport)\"\n  Header: \"Message\"\n  ```\n- Stocke dans MessageName\n\n### 2. Demander les proprietes du message\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quelles donnees porte le message ? Format: userId:int,email:string,orderId:string (laisser vide si aucune)\"\n  Header: \"Donnees\"\n  ```\n\n### 3. Demander le type de transport\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel transport pour ce message ?\"\n  Header: \"Transport\"\n  Options:\n    - \"async (Recommande)\" : \"Traitement asynchrone via le transport par defaut (doctrine, redis, amqp...)\"\n    - \"sync\" : \"Traitement synchrone immediat\"\n    - \"failed\" : \"Recu depuis la file d'erreurs (pour retraitement)\"\n  ```\n\n### 4. Demander les options avancees\n\n- Utilise AskUserQuestion (multiSelect: true) pour demander :\n  ```\n  Question: \"Quelles options activer ?\"\n  Header: \"Options\"\n  Options:\n    - \"Stamps\" : \"Ajouter des stamps personnalises (metadata sur le message)\"\n    - \"Middleware\" : \"Generer un middleware pour ce type de message\"\n    - \"Retry strategy\" : \"Configurer la strategie de retry en cas d'echec\"\n  ```\n\n### 5. Detecter le namespace du projet\n\n- Lis `composer.json` avec Read\n- Extrais le namespace depuis `autoload.psr-4`\n- Si non trouve, utilise `App` par defaut\n\n### 6. Generer la classe Message\n\n- Cree le fichier `src\u002FMessage\u002F{MessageName}.php` avec Write\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Message;\n\nfinal class {MessageName}\n{\n    public function __construct(\n        private readonly int $userId,\n        private readonly string $email,\n    ) {\n    }\n\n    public function getUserId(): int\n    {\n        return $this->userId;\n    }\n\n    public function getEmail(): string\n    {\n        return $this->email;\n    }\n}\n```\n\n**Regles de generation :**\n- Classe `final`, pas d'heritage, pas d'interface\n- Proprietes `private readonly` via promoted constructor\n- Getters pour chaque propriete\n- Pas de setters (message immuable)\n- Pas d'injection de services (un message est un simple DTO)\n- Les proprietes doivent etre serialisables (scalaires, tableaux, objets simples)\n\n### 7. Generer le MessageHandler\n\n- Cree le fichier `src\u002FMessageHandler\u002F{MessageName}Handler.php` avec Write\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\MessageHandler;\n\nuse {namespace}\\Message\\{MessageName};\nuse Symfony\\Component\\Messenger\\Attribute\\AsMessageHandler;\n\n#[AsMessageHandler]\nfinal class {MessageName}Handler\n{\n    public function __construct(\n        \u002F\u002F Injecter les services necessaires\n    ) {\n    }\n\n    public function __invoke({MessageName} $message): void\n    {\n        \u002F\u002F Logique de traitement\n        \u002F\u002F $message->getUserId()\n        \u002F\u002F $message->getEmail()\n    }\n}\n```\n\n**Regles de generation :**\n- Classe `final` avec attribut `#[AsMessageHandler]`\n- Methode `__invoke()` avec le message en parametre\n- Injection de dependances via constructeur\n- Retour `void` par defaut (sauf si query avec retour)\n\n### 8. Generer le middleware (si demande)\n\n- Cree le fichier `src\u002FMessenger\u002FMiddleware\u002F{MessageName}Middleware.php` avec Write\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Messenger\\Middleware;\n\nuse Symfony\\Component\\Messenger\\Envelope;\nuse Symfony\\Component\\Messenger\\Middleware\\MiddlewareInterface;\nuse Symfony\\Component\\Messenger\\Middleware\\StackInterface;\n\nfinal class {MessageName}Middleware implements MiddlewareInterface\n{\n    public function handle(Envelope $envelope, StackInterface $stack): Envelope\n    {\n        \u002F\u002F Logique avant traitement\n\n        $envelope = $stack->next()->handle($envelope, $stack);\n\n        \u002F\u002F Logique apres traitement\n\n        return $envelope;\n    }\n}\n```\n\n### 9. Afficher le resume\n\nAffiche :\n```\nMessage {MessageName} genere avec succes\n\nFichiers crees :\n- src\u002FMessage\u002F{MessageName}.php\n- src\u002FMessageHandler\u002F{MessageName}Handler.php\n\nDispatch du message :\n  $this->messageBus->dispatch(new {MessageName}($userId, $email));\n\nConfiguration du routing (config\u002Fpackages\u002Fmessenger.yaml) :\n  framework:\n      messenger:\n          routing:\n              '{namespace}\\Message\\{MessageName}': async\n\nProchaines etapes :\n- Implementer la logique dans le handler\n- Configurer le routing dans messenger.yaml\n- Lancer le worker : php bin\u002Fconsole messenger:consume async\n```\n\n## Patterns appliques\n\n### Message\n- Simple DTO immuable (pas de service, pas d'interface)\n- Constructeur avec promoted properties readonly\n- Serialisable (pas d'objets complexes comme des entites Doctrine)\n\n### Handler\n- `#[AsMessageHandler]` attribut (Symfony 6.2+)\n- Methode `__invoke()` invocable\n- Injection de services via constructeur\n\n### Middleware\n- Implements `MiddlewareInterface`\n- Pattern decorator : appeler `$stack->next()->handle()`\n\n## Notes\n- Un message ne doit contenir que des identifiants (pas des entites Doctrine entieres)\n- Preferer `#[AsMessageHandler]` a l'interface `MessageHandlerInterface`\n- Le routing (sync\u002Fasync) se configure dans `messenger.yaml`, pas dans le code\n- Utiliser `messenger:consume` pour lancer le worker\n- Configurer les retries dans `messenger.yaml` sous `failure_transport`\n",{"name":5,"model":30,"license":15,"version":31,"description":7,"allowed-tools":32},"sonnet","1.0.0",[33,20,34,35,36,37,38],"AskUserQuestion","Read","Write","Edit","Grep","Glob","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","symfony\u002Fskills\u002Fmessage","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas","https:\u002F\u002Fatournayre.github.io\u002Fclaude-personas\u002F","https:\u002F\u002Fgithub.com\u002Fatournayre","🔵, Back End Developer, @symfony  :heart:, @rectorphp :heart:,  \r\n:bug: fixer (creator sometimes 🤫), member of @afup","2026-03-02 23:42:20",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"symfony:message\"",{"tool":53,"command":54},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"symfony:message\"",{"tool":56,"command":57},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"symfony:message\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmessage\u002FSKILL.md",true,[61,67,73,79,83,87],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"agents\u002Fopenai.yaml","REFERENCE","参考文档",294,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fslides\u002Fagents\u002Fopenai.yaml",{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"assets\u002Ffile-presentation.jpg","ASSET","资产文件",2921,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fslides\u002Fassets\u002Ffile-presentation.jpg",{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Finit_pro_deck_builder_js.js","SCRIPT","脚本",8967,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fslides\u002Fscripts\u002Finit_pro_deck_builder_js.js",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Fprepare_reference_prompts.js",10738,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fslides\u002Fscripts\u002Fprepare_reference_prompts.js",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"scripts\u002Fpro_deck_quality_check.js",25503,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fslides\u002Fscripts\u002Fpro_deck_quality_check.js",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"templates\u002Fbuild_pro_deck_template.js",20675,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fslides\u002Ftemplates\u002Fbuild_pro_deck_template.js",[92,104,144,151,162,170],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":25},"01M6CSZPR0W1K1S9BX3247CZJ1","twig:make-component","Génère un Twig Component Symfony UX (classe PHP + template Twig)","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftwig\u002Fskills\u002Fmake-component\u002FSKILL.md",[],[99,100,22,24,23,101,21,102,103,20],"twig:make component","component","ux","template","php",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":126,"publishedAt":25},"01M6CSZKCYYT4EAW4CDSTS3TSH","tester:ui-test","Teste automatiquement une interface utilisateur dans Chrome : navigation, clics, validation visuelle, tests fonctionnels, responsive, comportement et debug. Génère un rapport détaillé avec screenshots et optionnellement un GIF du parcours.","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftester\u002Fskills\u002Fui-test\u002FSKILL.md",[110,115,118,121],{"categoryNo":111,"categoryName":112,"taxonomyType":113,"taxonomyTypeDesc":114},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":116,"categoryName":117,"taxonomyType":113,"taxonomyTypeDesc":114},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":119,"categoryName":120,"taxonomyType":113,"taxonomyTypeDesc":114},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":122,"categoryName":123,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[127,128,129,130,131,132,133,134,135,136,137,20,138,139,140,141,22,23,142,143],"test","ui","tester","ui test","tester:ui test","chrome","debug","create","update","validation","messages","plan","tool","page","find","javascript","MCP",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":25},"01M6CSZGQ8X9XNXRBYX0AA3CYE","symfony:voter","Genere un Voter de securite Symfony pour le controle d'acces granulaire","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fvoter\u002FSKILL.md",[],[146,20,21,22,23,24],{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":160,"publishedAt":25},"01M6CSZBWSK9M6YMJX886BVWYF","symfony:mailer","Genere un email Symfony (TemplatedEmail ou Notification) avec template Twig","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmailer\u002FSKILL.md",[157],{"categoryNo":158,"categoryName":159,"taxonomyType":113,"taxonomyTypeDesc":114},"01JBSEEDCAT000000000000005","邮件与沟通",[153,20,161,102,21,22,23,24],"email",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":25},"01M6CSZ9DXMYZ9HTRE8A324AWG","symfony:form","Genere un FormType Symfony avec contraintes de validation et options","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fform\u002FSKILL.md",[],[164,136,20,21,22,23,24,169],"options",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":25},"01M6CSZ73A0RY9G0WY091HJGYV","symfony:event","Genere un Event Symfony + EventSubscriber ou EventListener","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fevent\u002FSKILL.md",[],[172,21,22,23,24,20]]