granted annotation php routing symfony

php - annotation - symfony login roles



Enrutamiento en Symfony2 (10)

// Symfony2 PR10

en routing.yml:

default: pattern: /{_controller}

Le permite usar este tipo de URL: http://localhost/MySuperBundle:MyController:myview

¿Cómo configurar el enrutamiento predeterminado en Symfony2?

En Symfony1 se veía algo como esto:

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



Aquí hay un ejemplo: http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing

Una definición de ruta solo tiene un pattern parámetro obligatorio y tres parámetros opcionales defaults , requirements y options .

Aquí hay una ruta de mi propio proyecto:

video: pattern: /watch/{id}/{slug} defaults: { _controller: SiteBundle:Video:watch } requirements: { id: "/d+", slug: "[/w-]+"


Crear una ruta predeterminada no es una buena manera de programar. ¿Por qué? Porque por esta razón se implementó Excepción. Symfony2 está diseñado solo para hacer las cosas bien de la manera correcta.

Si desea redirigir todas las rutas "no encontradas", debe usar la excepción, como NotFound404 o algo similar. Incluso puede personalizar esta página por su cuenta.

Una ruta es para un propósito. Siempre. Otro pensar es malo.


Depende ... Algunos de los míos se ven así:

api_email: resource: "@MApiBundle/Resources/config/routing_email.yml" prefix: /

y algunos se ven como

api_images: path: /images/{listingId}/{width}/{fileName} defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null } methods: [GET] requirements: fileName: .+


El componente de enrutamiento estándar Symfony2 no lo admite, pero este paquete llena el espacio restante Symfony1:

https://github.com/LeaseWeb/LswDefaultRoutingBundle

Hace lo que esperas Puede enrutar un paquete por defecto usando esta sintaxis:

FosUserBundle: resource: "@FosUserBundle" prefix: / type: default

Escanea su paquete y automáticamente agrega rutas a su tabla de enrutadores que puede depurar ejecutando:

app/console router:debug

Ejemplo de rutas predeterminadas agregadas automáticamente:

[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} ...

Verá que también admite la selección automática de "formato" al usar una extensión de archivo (html, json o xml).


Estaba buscando en el libro de cocina una respuesta a esto, y creo que lo encontré here . De forma predeterminada, todos los parámetros de ruta tienen un requisito oculto de que coincidan con cualquier carácter excepto el carácter / ([^ /] +), pero este comportamiento se puede anular con la palabra clave de requisitos, forzándolo a hacer coincidir cualquier carácter.

Lo siguiente debe crear una ruta predeterminada que atrape a todos los demás, y como tal, debe ser la última en su configuración de enrutamiento, ya que las siguientes rutas nunca coincidirán. Para asegurarse de que coincida con "/" también, se incluye un valor predeterminado para el parámetro url.

default_route: pattern: /{url} defaults: { _controller: AcmeBundle:Default:index, url: "index" } requirements: url: ".+"



Podría crear su propio paquete que manejara todas las solicitudes y usar los parámetros de URL para construir una cadena para pasar al método de reenvío del controlador. Pero eso es bastante malo, me gustaría ir con rutas bien definidas, mantiene sus URL más limpias y desacopla la URL y los nombres de los controladores. Si cambia el nombre de un paquete o algo, ¿tiene que refactorizar sus URL?


Si desea crear un "atrapar todo", su mejor KernelEvents::EXCEPTION sería conectar el evento KernelEvents::EXCEPTION . Este evento se activa cada vez que una Excepción cae al HttpKernel , esto incluye la NotFoundHttpException lanzada cuando el enrutador no puede resolver una ruta a un Controlador.

El efecto sería similar a la página 404 estilizada de Symfony que se representa cuando envía la solicitud a través de app_dev.php. En lugar de devolver un 404, realiza cualquier lógica que esté buscando.