Hola.
Quiero establecer una opccion personalizada en el parametro options cuando defino una ruta:
# app/config/routing.yml my_route: pattern: /foo defaults: { _controller: HelloBundle:Hello:index } options: custom_option: true
Como ven la opción custom_option: true
es adicional. Quiero poder controlar algunas cosas cuando una ruta incluya ese parámetro, tal como lo hace FOSJsRoutingBundle
Estuve revisando el código de ese bundle pero no encuentro muy claro cómo lo hace, ya que no hay listeners o algo así.
¿Qué debo hacer para procesar ese tipo de parámetros en una ruta?
Gracias.
Respuestas
Buenas,
Prueba en el controlador algo como:
public function myAction(Request $request) { $routeName = $request->attributes->get('_route'); //nombre de la ruta actual // Obtienes el objeto Route con las opciones: $route = $this->get('router')->getRouteCollection()->get($routeName); dump($route->getOptions()); dump($route->getOption('custom_option')); }
Por facilidad también podrías colocar tu opción directo en defaults:
my_route: pattern: /foo defaults: { _controller: HelloBundle:Hello:index, optionX: true }
Así la recibirías como un argumento en la acción myAction(Request $request, $optionX)
Saludos!
@manuel_j555
Hola muchas gracias por tu respuesta.
Ahora tengo un problema, cuando trato de hacer:
//nombre de la ruta actual $routeName = $request->attributes->get('_route'); // Obtienes el objeto Route con las opciones: $route = $this->get('router')->getRouteCollection()->get($routeName); $route->getOption('custom_option')
o
$route->getOptions()
Obtengo el siguiente error:
Error: Call to a member function getOption() on a non-object
Esto pasa si la opción no está definida en el route
, pero si esta definida no arroja el error. ¿Cómo debo comprobar que esa opción exista? Ya he intentado diferentes maneras y no lo consigo.
Gracias.
@ramiroanacona
Hola, ya encontré el problema, se debe a que estoy analizando también route como _wdt
No se por qué el problema pero a eso se debe.
Gracias.
@ramiroanacona
La clase Symfony\Component\Routing\Route
dispone de un método llamado hasOption()
que comprueba si existe la opción que le indicas. Así que tendrías que utilizar lo siguiente:
$routeName = $request->attributes->get('_route'); $route = $this->get('router')->getRouteCollection()->get($routeName); if ($route->hasOption('custom_option')) { $valor = $route->getOption('custom_option'); }
@javiereguiluz
Muchas gracias.
@ramiroanacona