first commit
This commit is contained in:
114
src/Category/CategoryController.php
Normal file
114
src/Category/CategoryController.php
Normal file
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Category;
|
||||
|
||||
use App\Shared\Http\FlashServiceInterface;
|
||||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Slim\Views\Twig;
|
||||
|
||||
/**
|
||||
* Contrôleur pour la gestion des catégories.
|
||||
*
|
||||
* Accessible aux éditeurs et administrateurs (protégé par EditorMiddleware).
|
||||
* Gère la liste des catégories, leur création et leur suppression.
|
||||
* Toute la logique métier (génération de slug, validations, blocage de
|
||||
* suppression) est déléguée à CategoryService.
|
||||
*/
|
||||
final class CategoryController
|
||||
{
|
||||
/**
|
||||
* @param Twig $view Moteur de templates Twig
|
||||
* @param CategoryServiceInterface $categoryService Service de gestion des catégories
|
||||
* @param FlashServiceInterface $flash Service de messages flash
|
||||
*/
|
||||
public function __construct(
|
||||
private readonly Twig $view,
|
||||
private readonly CategoryServiceInterface $categoryService,
|
||||
private readonly FlashServiceInterface $flash,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Affiche la liste des catégories avec le formulaire de création.
|
||||
*
|
||||
* @param Request $req La requête HTTP
|
||||
* @param Response $res La réponse HTTP
|
||||
*
|
||||
* @return Response La vue de gestion des catégories
|
||||
*/
|
||||
public function index(Request $req, Response $res): Response
|
||||
{
|
||||
return $this->view->render($res, 'admin/categories/index.twig', [
|
||||
'categories' => $this->categoryService->findAll(),
|
||||
'error' => $this->flash->get('category_error'),
|
||||
'success' => $this->flash->get('category_success'),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Traite la création d'une catégorie.
|
||||
*
|
||||
* Délègue entièrement à CategoryService::create() qui gère la génération
|
||||
* du slug, la validation d'unicité et la validation du modèle.
|
||||
*
|
||||
* @param Request $req La requête HTTP
|
||||
* @param Response $res La réponse HTTP
|
||||
*
|
||||
* @return Response Une redirection vers /admin/categories
|
||||
*/
|
||||
public function create(Request $req, Response $res): Response
|
||||
{
|
||||
/** @var array<string, mixed> $data */
|
||||
$data = (array) $req->getParsedBody();
|
||||
$name = (string) ($data['name'] ?? '');
|
||||
|
||||
try {
|
||||
$this->categoryService->create($name);
|
||||
$trimmed = trim($name);
|
||||
$this->flash->set('category_success', "La catégorie « {$trimmed} » a été créée avec succès");
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
$this->flash->set('category_error', $e->getMessage());
|
||||
} catch (\Throwable) {
|
||||
$this->flash->set('category_error', "Une erreur inattendue s'est produite");
|
||||
}
|
||||
|
||||
return $res->withHeader('Location', '/admin/categories')->withStatus(302);
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprime une catégorie.
|
||||
*
|
||||
* Délègue à CategoryService::delete() qui refuse la suppression si des
|
||||
* articles sont rattachés à la catégorie.
|
||||
*
|
||||
* @param Request $req La requête HTTP
|
||||
* @param Response $res La réponse HTTP
|
||||
* @param array<string, string> $args Paramètres de route (id)
|
||||
*
|
||||
* @return Response Une redirection vers /admin/categories
|
||||
*/
|
||||
public function delete(Request $req, Response $res, array $args): Response
|
||||
{
|
||||
$id = (int) ($args['id'] ?? 0);
|
||||
$category = $this->categoryService->findById($id);
|
||||
|
||||
if ($category === null) {
|
||||
$this->flash->set('category_error', 'Catégorie introuvable');
|
||||
|
||||
return $res->withHeader('Location', '/admin/categories')->withStatus(302);
|
||||
}
|
||||
|
||||
try {
|
||||
$this->categoryService->delete($category);
|
||||
$this->flash->set('category_success', "La catégorie « {$category->getName()} » a été supprimée");
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
$this->flash->set('category_error', $e->getMessage());
|
||||
} catch (\Throwable) {
|
||||
$this->flash->set('category_error', "Une erreur inattendue s'est produite");
|
||||
}
|
||||
|
||||
return $res->withHeader('Location', '/admin/categories')->withStatus(302);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user