In una delle precedenti lezioni abbiamo visto come effettuare un redirect all'interno del controller della pagina di login qualora l'utente fosse già loggato:
if ($this->getUser()) {
return $this->redirectToRoute('index');
}
In realtà la possibilità di effettuare dei redirect è solo uno dei metodi che la classe Symfony\Bundle\FrameworkBundle\Controller\AbstractController
ci mette a disposizione. AbstractController
è la classe che viene estesa da tutti i controller che creeremo nel progetto. Obiettivo della lezione è approfondire alcuni metodi che possono esserci utili durante il nostro lavoro.
Accesso alle informazioni del Container
Il Container di Symfony consente anche di accedere ai servizi e ai parametri definiti nell'applicazione. All'interno del controller possiamo accedere a tali informazioni attraverso i due helper dedicati:
$this->get('nome.servizio')
$this-getParameter('nome.parametro')
Gestione delle rotte
Il redirect visto a inizio articolo è solo uno dei modi di redirigere l'utente in un'altra pagina. Alcuni dei metodi utili durante lo sviluppo sono:
/**
* Returns a RedirectResponse to the given route with the given parameters.
*/
protected function redirectToRoute(string $route, array $parameters = [], int $status = 302): RedirectResponse
Il metodo prende in ingresso come argomenti il nome di una rotta che abbiamo dichiarato, eventuali parametri che la compongono o da aggiungere in querystring e lo status code per il redirect. Il risultato della chiamata sarà il redirect alla nuova pagina.
/**
* Returns a RedirectResponse to the given URL.
*/
protected function redirect(string $url, int $status = 302): RedirectResponse
Come suggerisce il nome esso opera un redirect all'indirizzo passato come stringa. La differenza rispetto al metodo precedente è che quest'ultimo può effettuare redirect anche verso indirizzi non definiti come rotte all'interno del progetto.
/**
* Generates a URL from the given parameters.
*
* @see UrlGeneratorInterface
*/
protected function generateUrl(string $route, array $parameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): string
Il metodo ha un funzionamento simile a redirectToRoute
, la differenza sostanziale è che restituisce una stringa contenente la rotta anziché effettuare il redirect.
/**
* Forwards the request to another controller.
*
* @param string $controller The controller name (a string like Bundle\BlogBundle\Controller\PostController::indexAction)
*/
protected function forward(string $controller, array $path = [], array $query = []): Response
Il metodo forward
consente di "inoltrare" la richiesta a un altro controller senza che ci sia un redirect effettivo. Il browser (o client in generale) non vedrà il cambio di pagina anche se il codice del nuovo controller verrà eseguito.
Gestione delle risposte
Abbiamo visto che possiamo generare una risposta renderizzando un template di Twig attraverso:
$this->render('home/index.html.twig');
Anche in questo caso non è l'unica opzione che abbiamo per generare una risposta a una richiesta.
/**
* Returns a JsonResponse that uses the serializer component if enabled, or json_encode.
*/
protected function json($data, int $status = 200, array $headers = [], array $context = []): JsonResponse
Il metodo json()
consente di generare una risposta in formato JSON del dato inviato come primo parametro. Utile quando si lavora con API, ad esempio.
/**
* Returns a BinaryFileResponse object with original or customized file name and disposition header.
*
* @param \SplFileInfo|string $file File object or path to file to be sent as response
*/
protected function file($file, string $fileName = null, string $disposition = ResponseHeaderBag::DISPOSITION_ATTACHMENT): BinaryFileResponse
Il metodo file()
è utile se abbiamo bisogno di inviare un file binario come risposta, ad esempio quando abbiamo a che fare con PDF generati dal sistema.
Altri metodi della classe sono stati volutamente omessi poiché necessitano di un po' più di contesto. Verranno comunque approfonditi in seguito.