Ricerca…
introduzione
Un controller in Symfony è un PHP callable (una funzione, un metodo su un oggetto o una chiusura) che riceve una richiesta HTTP e restituisce una risposta HTTP. Una risposta HTTP può contenere qualsiasi cosa: una pagina HTML, una stringa JSON, un download di file, ecc.
Per comunicare a Symfony quale controller deve gestire una determinata richiesta, è necessario configurare una rotta .
Sintassi
- $ this-> generateUrl ('route_name', ['placeholder' => 'value']); // genera un URL per la route
route_name
con un segnaposto - $ This-> render ( 'template.html.twig'); // esegue il rendering di un modello Twig e restituisce un oggetto Response
- $ this-> render ('template.html.twig', ['parameter' => $ value]); // esegue il rendering di un modello Twig con un parametro
- buttare $ this-> createNotFoundException ('Message'); // lancia una NotFoundHttpException che farà sì che Symfony restituisca una risposta 404
Osservazioni
I controllori dovrebbero essere piccoli e concentrarsi sulla gestione delle richieste HTTP: la logica di business effettiva della tua applicazione dovrebbe essere delegata a diverse parti della tua applicazione, ad esempio il tuo modello di dominio.
Una semplice classe di controller
// src/AppBundle/Controller/HelloWorldController.php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloWorldController
{
public function helloWorldAction()
{
return new Response(
'<html><body>Hello World!</body></html>'
);
}
}
Rendering di un modello Twig
Nella maggior parte dei casi, si desidera eseguire il rendering di risposte HTML da un modello invece di codificare l'HTML nel controller. Inoltre, i tuoi modelli non saranno statici ma conterranno segnaposto per i dati dell'applicazione. Per impostazione predefinita, Symfony viene fornito con Twig, un potente linguaggio di template.
Per utilizzare Twig nel controller, estendere la classe Controller
base di Symfony:
// src/AppBundle/Controller/HelloWorldController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloWorldController extends Controller
{
public function helloWorldAction()
{
$text = 'Hello World!';
return $this->render('hello-world.html.twig', ['text' => $text]);
}
}
Crea il template Twig (che si trova in app/Resources/views/hello-world.html.twig
):
<html><body>{{ text }}</body></html>
Twig sostituirà automaticamente il segnaposto {{ text }}
con il valore del parametro text
, passato dal controller. Questo renderà il seguente output HTML:
<html><body>Hello World!</body></html>
Restituzione di una pagina 404 (non trovata)
A volte si desidera restituire una risposta 404 (non trovata), poiché la risorsa richiesta non esiste. Symfony ti consente di lanciare NotFoundHttpException
.
Il controller di base di Symfony espone un metodo createNotFoundException
che crea l'eccezione per te:
public function indexAction()
{
// retrieve the object from database
$product = ...;
if (!$product) {
throw $this->createNotFoundException('The product does not exist');
}
// continue with the normal flow if no exception is thrown
return $this->render(...);
}
Utilizzo dei dati dall'oggetto Richiesta
Se è necessario accedere all'oggetto Request
(ad esempio per leggere i parametri della query, leggere un'intestazione HTTP o elaborare un file caricato), è possibile ricevere la richiesta come argomento del metodo aggiungendo un argomento type-hinted:
use Symfony\Component\HttpFoundation\Request;
public function indexAction(Request $request)
{
$queryParam = $request->query->get('param');
// ...
}
Symfony riconoscerà il suggerimento sul tipo e aggiungerà l'argomento della richiesta alla chiamata del controller.