Source of file ControllerRouting.php

Size: 3,650 Bytes - Last Modified: 2023-11-16T22:56:02+01:00

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/core-bundle/src/Traits/ControllerRouting.php

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
<?php
namespace TIC\CoreBundle\Traits;

use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Gestion des routes associées au controlleur & réponses de redirections.
 */
trait ControllerRouting
{
	// Initialisation automatique des propriétés à partir du nom de la classe courante
	use \TIC\CoreBundle\Traits\ContextProperties;   // ctxRoute

	/**
	 * Raccourci pour générer le nom de la route d'une action du controlleur.
	 *
	 * @param   string  $action     Nom de l'action (utilisée en suffixe de la route)
	 * @param   mixed   $item       Entité (avec getId) ou clé primaire pour la route (id)
	 * @param   array   $params     Liste des paramètres pour la génération de l'URL
	 * @return  string              URL de la route correspondante
	 */
	protected function getRoute(string $action, mixed $item = null, ?array $params = []): string
	{
		if (null !== $item && empty($params)) {
			if     (\is_scalar($item)) $params['id'] = $item;
			elseif (\is_object($item)) $params['id'] = $item->getId();
			elseif (\is_array($item) && isset($item['id'])) $params['id'] = $item['id'];
		}
		return $this->generateUrl($this->ctxRoute . $action, $params);
	}

	/**
	 * Redirection vers l'action par défaut de liste.
	 *
	 * @param   array   $params     Liste des paramètres pour la génération de l'URL
	 * @param   integer $status     Code HTTP de la réponse à retourner
	 * @return  RedirectResponse    Réponse HTTP avec redirection vers la route correspondante
	 */
	protected function redirectList(?array $params = [], int $status = 303): RedirectResponse
	{
		return $this->redirect($this->getRoute('list', null, $params), $status);
	}

	/**
	 * Redirection vers l'action par défaut de fiche.
	 *
	 * @param   mixed   $item       Entité (avec getId) ou clé primaire pour la route (id)
	 * @param   array   $params     Liste des paramètres pour la génération de l'URL
	 * @param   integer $status     Code HTTP de la réponse à retourner
	 * @return  RedirectResponse    Réponse HTTP avec redirection vers la route correspondante
	 */
	protected function redirectItem(mixed $item, ?array $params = [], int $status = 303): RedirectResponse
	{
		return $this->redirect($this->getRoute('show', $item, $params), $status);
	}

	/**
	 * Redirection vers l'adresse du referer (depuis entêtes du serveur web).
	 *
	 * @param   integer $status     Code HTTP de la réponse à retourner
	 * @return  RedirectResponse    Réponse HTTP avec redirection vers la page précédente
	 */
	protected function redirectReferer(int $status = 302): RedirectResponse
	{
		$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
		if (null === $referer) {
			$request = $this->container->get('request_stack')->getCurrentRequest();
			if ($request) $referer = $request->headers->get('referer');
		}
		return $this->redirect($referer, $status);
	}

	/**
	 * Redirection automatique selon le paramètre (liste, fiche, referer, autre...).
	 *
	 * @param   mixed   $target     Boolean (liste/referer), Entité (ou id) ou autre route
	 * @return  RedirectResponse    Réponse HTTP avec redirection vers l'URL correspondante
	 */
	protected function redirectTo(mixed $target = false): ?RedirectResponse
	{
		if ($target === false)    return $this->redirectReferer();
		if ($target === true)     return $this->redirectList();
		if (\is_object($target))  return $this->redirectItem($target);
		if (\is_array($target))   return $this->redirectItem($target);
		if (\is_numeric($target)) return $this->redirectItem($target);
		if (\is_string($target))  return $this->redirect($this->generateUrl($target));
		return null;
	}

}