web-dev-qa-db-fra.com

Routage dans Symfony2

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/...
25
umpirsky

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: ".+"
28
Longsight

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

8
dxb

// Symfony2 PR10

dans routing.yml:

default:
    pattern:  /{_controller}

Il vous permet d’utiliser ce type d’URL: http: // localhost/MySuperBundle: MyController: myview

8
Denis Gorbachev

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).

4
mevdschee

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-]+" 
3
Crozin

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.

2
ken

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.

2
Marc Morera Merino

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?

1
MFoster

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.

1
D H

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: .+
0
luminol