From symfony
Genere un controleur Symfony avec routing attributs et bonnes pratiques
How this skill is triggered — by the user, by Claude, or both
Slash command
/symfony:controllersonnetThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Genere un controleur Symfony avec routing par attributs PHP 8, injection de dependances et bonnes pratiques.
Genere un controleur Symfony avec routing par attributs PHP 8, injection de dependances et bonnes pratiques.
src/Controller/{ControllerName}.phptemplates/{entity_name}/{action}.html.twig (si HTML)IMPORTANT : Execute ce workflow etape par etape :
Question: "Quel est le nom du controleur ? (ex: Product, UserProfile)"
Header: "Controleur"
Controller si absentQuestion: "Quel type de controleur ?"
Header: "Type"
Options:
- "CRUD (Recommande)" : "Index, show, new, edit, delete — controleur CRUD complet"
- "API" : "Controleur API retournant du JSON (JsonResponse)"
- "Single action" : "Controleur invocable (__invoke) pour une seule action"
- "Custom" : "Choisir les actions manuellement"
Question: "Quelles actions ? Format: index:GET:/products,show:GET:/products/{id},create:POST:/products"
Header: "Actions"
Question: "Quelles options activer ?"
Header: "Options"
Options:
- "Templates Twig" : "Generer les templates Twig associes a chaque action"
- "Form integration" : "Integrer FormType pour new/edit (CRUD)"
- "Security" : "Ajouter #[IsGranted] sur les actions sensibles"
composer.json avec Readautoload.psr-4App par defautsrc/Controller/{ControllerName}.php avec WriteControleur CRUD :
<?php
declare(strict_types=1);
namespace {namespace}\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
#[Route('/{entity_name}')]
final class {ControllerName} extends AbstractController
{
#[Route('', name: '{entity_name}_index', methods: ['GET'])]
public function index(): Response
{
return $this->render('{entity_name}/index.html.twig', [
// 'items' => $repository->findAll(),
]);
}
#[Route('/{id}', name: '{entity_name}_show', methods: ['GET'])]
public function show(int $id): Response
{
return $this->render('{entity_name}/show.html.twig', [
// 'item' => $repository->find($id),
]);
}
#[Route('/new', name: '{entity_name}_new', methods: ['GET', 'POST'])]
public function new(Request $request): Response
{
// $form = $this->createForm(EntityType::class);
// $form->handleRequest($request);
return $this->render('{entity_name}/new.html.twig', [
// 'form' => $form,
]);
}
#[Route('/{id}/edit', name: '{entity_name}_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, int $id): Response
{
return $this->render('{entity_name}/edit.html.twig', [
// 'form' => $form,
]);
}
#[Route('/{id}', name: '{entity_name}_delete', methods: ['POST'])]
public function delete(Request $request, int $id): Response
{
// CSRF token validation
// $entityManager->remove($entity);
// $entityManager->flush();
return $this->redirectToRoute('{entity_name}_index');
}
}
Controleur API :
#[Route('/api/{entity_name}')]
final class {ControllerName} extends AbstractController
{
#[Route('', methods: ['GET'])]
public function list(): JsonResponse { ... }
#[Route('/{id}', methods: ['GET'])]
public function show(int $id): JsonResponse { ... }
#[Route('', methods: ['POST'])]
public function create(Request $request): JsonResponse { ... }
#[Route('/{id}', methods: ['PUT'])]
public function update(Request $request, int $id): JsonResponse { ... }
#[Route('/{id}', methods: ['DELETE'])]
public function delete(int $id): JsonResponse { ... }
}
Controleur Single Action :
#[Route('/{path}', name: '{route_name}', methods: ['GET'])]
final class {ControllerName} extends AbstractController
{
public function __invoke(): Response
{
return $this->render('{template}.html.twig');
}
}
Regles de generation :
final etendant AbstractController#[Route] sur la classe pour le prefixe de route#[Route] sur chaque methode avec name et methods#[IsGranted('ROLE_ADMIN')] sur edit/delete/newPour chaque action, creer le template correspondant dans templates/{entity_name}/.
Affiche :
Controleur {ControllerName} genere avec succes
Fichiers crees :
- src/Controller/{ControllerName}.php
- templates/{entity_name}/index.html.twig (si applicable)
- templates/{entity_name}/show.html.twig (si applicable)
...
Routes :
- GET /{entity_name} -> {entity_name}_index
- GET /{entity_name}/{id} -> {entity_name}_show
...
Prochaines etapes :
- Injecter le repository dans les methodes
- Creer les templates Twig
- Configurer la securite si necessaire
final, extends AbstractController#[Route])#[IsGranted] pour la securiteSymfony\Component\Routing\Attribute\Route (Symfony 6.2+)methods: []AbstractController (pas Controller) pour les helpers Twig/Securitynpx claudepluginhub atournayre/claude-personas --plugin symfonyReference for all 38 Symfony components covering APIs, configuration, best practices, and common pitfalls for PHP 8.3+ and Symfony 7.x.
Provides Symfony framework reference with architecture patterns, DDD integration, clean architecture checklists, common violations, and antipatterns for auditing PHP projects.
Creates Symfony forms with custom Form Types, validation constraints, HTTP 422 response handling, and multi-step form flows.