Recherche…
Renvoie une réponse 404
404 réponses sont renvoyées lorsqu'une ressource est introuvable sur le serveur. Dans Symfony, ce statut peut être créé en lançant une exception NotFoundHttpException
. Pour éviter une instruction d' use
supplémentaire dans un contrôleur, utilisez le createNotFoundException()
fourni par la 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));
}
}
Routes multiples
Dans Symfony, il est possible de définir plusieurs routes pour une action. Cela peut être très utile si vous avez des fonctions qui font la même chose mais qui ont des paramètres différents.
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));
}
}
Redirection de demande POST
Lorsque vous êtes dans un controllerAction Et que vous recevez une requête POST , mais que vous souhaitez la rediriger vers un autre itinéraire , tout en conservant la méthode POST et l'objet de requête , vous pouvez utiliser les éléments suivants:
return $this->redirectToRoute('route', array(
'request' => $request,
), 307);
Le code 307 conserve ici la méthode de requête.
Routage basé sur un sous-domaine
Le routage basé sur un sous-domaine peut être géré dans Symfony en utilisant le paramètre host
. Par exemple, le paramètre _locale
peut être utilisé comme valeur de sous-domaine.
En supposant
locale: en
domain: somedomain.com
les paramètres sont définis dans le fichier de configuration parameters.yml
, route serait:
/**
* @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%"}
* )
*/
De ce point, le routeur peut gérer les adresses URI telles que http://de.somedomain.com
. La deuxième annotation @Route
peut être utilisée comme @Route
pour les paramètres régionaux par défaut et le sous-domaine void, http://somedomain.com
.
Routes Symfony utilisant Routing.yml
profile_user_profile:
path: /profile/{id}
defaults: { _controller: ProfileBundle:Profile:profile }
requirements:
id: \d+
methods: [get, delete]
Si vous décidez d'utiliser Routing.yml au lieu des Annotations, vous pouvez mieux voir toutes les routes et rechercher et en trouver plus facilement.
C'est à vous de choisir entre Routing.yml et Annotations . Vous pouvez utiliser les deux pour différents itinéraires, mais ce n'est pas la meilleure solution.
Annotation @Route()
est l'équivalent:
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));
}
}