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/...
Alternativamente, puede usar la anotación @Route directamente en un archivo de controlador. ver https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst
En cuanto a las rutas predeterminadas, creo que Symfony2 fomenta el mapeo explícito de rutas.
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: ".+"
No creo que sea posible con el componente de enrutamiento estándar. Eche un vistazo a este paquete, podría ser útil: https://github.com/hidenorigoto/DefaultRouteBundle
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.