Ricerca…
Restituisce una risposta 404
404 risposte vengono restituite quando una risorsa non viene trovata sul server, in Symfony questo stato può essere creato lanciando un'eccezione NotFoundHttpException
. Per evitare un'istruzione di use
extra all'interno di un controller, utilizzare createNotFoundException()
fornito dalla classe Controller
<?php
namespace Bundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class TestController extends Controller
{
/**
* @Route("/{id}", name="test")
* Recommended to avoid template() as it has a lot of background processing.
* Query database for 'test' record with 'id' using param converters.
*/
public function testAction(Test $test)
{
if (!$test) {
throw $this->createNotFoundException('Test record not found.');
}
return $this->render('::Test/test.html.twig', array('test' => $test));
}
}
Percorsi multipli
In Symfony è possibile definire più percorsi per un'azione. Questo può essere molto utile se si hanno funzioni uguali ma con parametri diversi.
class TestController extends Controller
{
/**
* @Route("/test1/{id}", name="test")
* @Route("/test2/{id}", name="test2")
* Here you can define multiple routes with multiple names
*/
public function testAction(Test $test)
{
if (!$test) {
throw $this->createNotFoundException('Test record not found.');
}
return $this->render('::Test/test.html.twig', array('test' => $test));
}
}
Reindirizzamento della richiesta POST
Quando ti trovi in un controllerAction e hai una richiesta POST in arrivo , ma vuoi reindirizzarla, su un percorso diverso , mentre stai ancora mantenendo il metodo POST e l'oggetto request , puoi usare quanto segue:
return $this->redirectToRoute('route', array(
'request' => $request,
), 307);
Il codice 307 qui conserva il metodo di richiesta.
Routing basato su sottodominio
Il routing basato su sottodominio può essere gestito in Symfony usando il parametro host
. Ad esempio, il parametro _locale
può essere utilizzato come valore di sottodominio.
assumendo
locale: en
domain: somedomain.com
i parametri sono definiti nel file di configurazione parameters.yml
, route sarebbe:
/**
* @Route(
* "/",
* name="homepage",
* host="{_locale}.{domain}",
* defaults={"_locale" = "%locale%", "domain" = "%domain%"},
* requirements={"_locale" = "%locale%|de|fr", "domain" = "%domain%"}
* )
* @Route(
* "/",
* name="homepage_default",
* defaults={"_locale" = "%locale%"}
* )
*/
Da questo punto il router può gestire gli URI come http://de.somedomain.com
. La seconda annotazione @Route
può essere utilizzata come fallback per le impostazioni locali predefinite e il sottodominio void, http://somedomain.com
.
Percorsi symfony usando Routing.yml
profile_user_profile:
path: /profile/{id}
defaults: { _controller: ProfileBundle:Profile:profile }
requirements:
id: \d+
methods: [get, delete]
Se decidi di utilizzare Routing.yml anziché Annotazioni, puoi ottenere una migliore visualizzazione di tutti i percorsi e più facile da cercare e trovare uno.
Spetta a te scegliere tra Routing.yml e Annotations . Puoi utilizzare entrambi per percorsi diversi ma questa non è la soluzione migliore.
@Route()
equivalente di Annotation @Route()
è:
class ProfileController extends Controller
{
/**
* @Route("/profile/{id}", name="profile_user_profile", requirements={"id": "\d+"})
* @Method("GET", "DELETE")
*/
public function profileAction($id)
{
if (!$id) {
throw $this->createNotFoundException('User not found.');
}
return $this->render('::Profile/profile.html.twig', array('id' => $id));
}
}