Comment configurer le routage par défaut dans Symfony2?
Dans Symfony1, cela ressemblait à quelque chose comme ça:
homepage:
url: /
param: { module: default, action: index }
default_symfony:
url: /symfony/:action/...
param: { module: default }
default_index:
url: /:module
param: { action: index }
default:
url: /:module/:action/...
Je cherchais une réponse dans le livre de recettes et je pense que je l’ai trouvée ici . Par défaut, tous les paramètres de route ont pour condition cachée de correspondre à n’importe quel caractère sauf le caractère/([^ /] +), mais ce problème peut être remplacé par le mot-clé exigences, en le forçant à correspondre à any. personnage.
Ce qui suit devrait créer un itinéraire par défaut qui capture tous les autres - et, en tant que tel, devrait figurer en dernier dans votre configuration de routage, car les itinéraires suivants ne correspondront jamais jamais. Pour s'assurer qu'il corresponde également à "/", une valeur par défaut pour le paramètre url est incluse.
default_route:
pattern: /{url}
defaults: { _controller: AcmeBundle:Default:index, url: "index" }
requirements:
url: ".+"
Je ne pense pas que ce soit possible avec le composant de routage standard. Jetez un coup d'œil à cet ensemble, cela pourrait aider: https://github.com/hidenorigoto/DefaultRouteBundle
// Symfony2 PR10
dans routing.yml:
default:
pattern: /{_controller}
Il vous permet d’utiliser ce type d’URL: http: // localhost/MySuperBundle: MyController: myview
Le composant de routage standard Symfony2 ne le prend pas en charge, mais cet ensemble comble le vide laissé par Symfony1:
https://github.com/LeaseWeb/LswDefaultRoutingBundle
Il fait ce que vous attendez. Vous pouvez router un paquet par défaut en utilisant cette syntaxe:
FosUserBundle:
resource: "@FosUserBundle"
prefix: /
type: default
Il analyse votre bundle et ajoute automatiquement des routes à votre table de routeur que vous pouvez déboguer en exécutant:
app/console router:debug
Exemple de routes par défaut ajoutées automatiquement:
[router] Current routes
Name Method Pattern
fos_user.user.login_check ANY /user/login_check.{_format}
fos_user.user.logout ANY /user/logout.{_format}
fos_user.user.login ANY /user/login.{_format}
...
Vous voyez qu'il prend également en charge la sélection automatique de "formatage" en utilisant une extension de fichier (html, json ou xml).
Voici un exemple: http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing
Une définition de route a un seul paramètre obligatoire pattern
et trois paramètres optionnels defaults
, requirements
et options
.
Voici un itinéraire de mon propre projet:
video:
pattern: /watch/{id}/{slug}
defaults: { _controller: SiteBundle:Video:watch }
requirements: { id: "\d+", slug: "[\w-]+"
Vous pouvez également utiliser l'annotation @Route directement dans un fichier contrôleur. voir https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst
En ce qui concerne les routes par défaut, je pense que Symfony2 encourage le mappage explicite des routes.
Créer une route par défaut n'est pas un bon moyen de programmation. Pourquoi? Parce que pour cette raison a été implémenté Exception. Symfony2 est construit juste pour faire les bonnes choses de la bonne manière.
Si vous souhaitez rediriger tous les itinéraires "non trouvés", vous devez utiliser une exception, comme NotFound404 ou quelque chose de similaire. Vous pouvez même personnaliser cette page par vous-même.
Un itinéraire est pour un but. Toujours. Les autres pensent que c'est mauvais.
Vous pouvez créer votre propre bundle, qui gère toutes les demandes et utilise des paramètres d'URL pour construire une chaîne à transmettre à la méthode de transmission du contrôleur. Mais c'est assez moche, j'irais avec des routes bien définies, cela garde vos URLs plus propres et dissocie les noms de l'URL et du contrôleur. Si vous renommez un paquet ou quelque chose du genre, devez-vous alors refactoriser vos URL?
Si vous voulez créer un "catch all", votre meilleur choix serait de vous accrocher à l'événement KernelEvents::EXCEPTION
. Cet événement est déclenché chaque fois qu'une exception tombe dans la variable HttpKernel
. Cela inclut la variable NotFoundHttpException
émise lorsque le routeur ne peut pas résoudre un itinéraire vers un contrôleur.
L'effet serait similaire à la page 404 stylisée de Symfony qui est rendue lorsque vous envoyez la demande via app_dev.php. Au lieu de renvoyer un 404, vous effectuez la logique de votre choix.
Cela dépend ... Certains des miens ressemblent à ceci:
api_email:
resource: "@MApiBundle/Resources/config/routing_email.yml"
prefix: /
et certains ressemblent
api_images:
path: /images/{listingId}/{width}/{fileName}
defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null }
methods: [GET]
requirements:
fileName: .+