1: <?php
2: namespace TIC\CoreBundle\Traits;
3:
4: use Symfony\Component\HttpFoundation\RedirectResponse;
5:
6: /**
7: * Gestion des routes associées au controlleur & réponses de redirections.
8: */
9: trait ControllerRouting
10: {
11: // Initialisation automatique des propriétés à partir du nom de la classe courante
12: use \TIC\CoreBundle\Traits\ContextProperties; // ctxRoute
13:
14: /**
15: * Raccourci pour générer le nom de la route d'une action du controlleur.
16: *
17: * @param string $action Nom de l'action (utilisée en suffixe de la route)
18: * @param mixed $item Entité (avec getId) ou clé primaire pour la route (id)
19: * @param array $params Liste des paramètres pour la génération de l'URL
20: * @return string URL de la route correspondante
21: */
22: protected function getRoute(string $action, mixed $item = null, ?array $params = []): string
23: {
24: if (null !== $item && empty($params)) {
25: if (\is_scalar($item)) $params['id'] = $item;
26: elseif (\is_object($item)) $params['id'] = $item->getId();
27: elseif (\is_array($item) && isset($item['id'])) $params['id'] = $item['id'];
28: }
29: return $this->generateUrl($this->ctxRoute . $action, $params);
30: }
31:
32: /**
33: * Redirection vers l'action par défaut de liste.
34: *
35: * @param array $params Liste des paramètres pour la génération de l'URL
36: * @param integer $status Code HTTP de la réponse à retourner
37: * @return RedirectResponse Réponse HTTP avec redirection vers la route correspondante
38: */
39: protected function redirectList(?array $params = [], int $status = 303): RedirectResponse
40: {
41: return $this->redirect($this->getRoute('list', null, $params), $status);
42: }
43:
44: /**
45: * Redirection vers l'action par défaut de fiche.
46: *
47: * @param mixed $item Entité (avec getId) ou clé primaire pour la route (id)
48: * @param array $params Liste des paramètres pour la génération de l'URL
49: * @param integer $status Code HTTP de la réponse à retourner
50: * @return RedirectResponse Réponse HTTP avec redirection vers la route correspondante
51: */
52: protected function redirectItem(mixed $item, ?array $params = [], int $status = 303): RedirectResponse
53: {
54: return $this->redirect($this->getRoute('show', $item, $params), $status);
55: }
56:
57: /**
58: * Redirection vers l'adresse du referer (depuis entêtes du serveur web).
59: *
60: * @param integer $status Code HTTP de la réponse à retourner
61: * @return RedirectResponse Réponse HTTP avec redirection vers la page précédente
62: */
63: protected function redirectReferer(int $status = 302): RedirectResponse
64: {
65: $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
66: if (null === $referer) {
67: $request = $this->container->get('request_stack')->getCurrentRequest();
68: if ($request) $referer = $request->headers->get('referer');
69: }
70: return $this->redirect($referer, $status);
71: }
72:
73: /**
74: * Redirection automatique selon le paramètre (liste, fiche, referer, autre...).
75: *
76: * @param mixed $target Boolean (liste/referer), Entité (ou id) ou autre route
77: * @return RedirectResponse Réponse HTTP avec redirection vers l'URL correspondante
78: */
79: protected function redirectTo(mixed $target = false): ?RedirectResponse
80: {
81: if ($target === false) return $this->redirectReferer();
82: if ($target === true) return $this->redirectList();
83: if (\is_object($target)) return $this->redirectItem($target);
84: if (\is_array($target)) return $this->redirectItem($target);
85: if (\is_numeric($target)) return $this->redirectItem($target);
86: if (\is_string($target)) return $this->redirect($this->generateUrl($target));
87: return null;
88: }
89:
90: }
91: