Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cómo definir opciones propias en las rutas de Symfony

20 de febrero de 2015

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

#1

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

21 febrero 2015, 0:32
#2

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

22 febrero 2015, 20:28
#3

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

22 febrero 2015, 20:49
#4

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

22 febrero 2015, 20:55
#5

Muchas gracias.

@ramiroanacona

22 febrero 2015, 21:23