symfonycontroller
Genere un controleur Symfony avec routing attributs et bonnes pratiques
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Genere un controleur Symfony avec routing attributs et bonnes pratiques
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
Audite un projet API Platform existant et produit un rapport de bonnes pratiques, performances et sécurité
Génère des DTOs (input/output) API Platform avec mapping vers les entités
Génère des filtres API Platform (search, date, range, order, boolean, exists, custom)
Génère un State Processor API Platform pour personnaliser la persistence des données
Génère un State Provider API Platform pour personnaliser la récupération de données
Génère une API Resource complète avec attribut
| name | symfony:controller |
| description | Genere un controleur Symfony avec routing attributs et bonnes pratiques |
| model | sonnet |
| allowed-tools | ["AskUserQuestion","Bash","Read","Write","Edit","Grep","Glob"] |
| version | 1.0.0 |
| license | MIT |
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/Security