2012-05-04 15 views
26

He estado usando Silex por un día, y tengo la primera pregunta "estúpida". Si tengo:¿Cómo obtengo todos los parámetros GET en Silex?

$app->get('/cities/{city_id}.json', function(Request $request, $city_id) use($app) { 
    .... 
}) 
->bind('city') 
->middleware($checkHash); 

quiero conseguir todos los parámetros (city_id) incluido en el middleware:

$checkHash = function (Request $request) use ($app) { 

    // not loading city_id, just the parameter after the ? 
    $params = $request->query->all(); 

    .... 
} 

Así que, ¿cómo consigo city_id (tanto el nombre del parámetro y su valor) en el interior el middleware. Voy a tener 30 acciones, así que necesito algo utilizable y mantenible.

¿Qué me estoy perdiendo?

muchas gracias!

Solución

tenemos que conseguir esos parámetros extra de $ peticion- > Atributos

$checkHash = function (Request $request) use ($app) { 

    // GET params 
    $params = $request->query->all(); 

    // Params which are on the PATH_INFO 
    foreach ($request->attributes as $key => $val) 
    { 
     // on the attributes ParamaterBag there are other parameters 
     // which start with a _parametername. We don't want them. 
     if (strpos($key, '_') != 0) 
     { 
      $params[ $key ] = $val; 
     } 
    } 

    // now we have all the parameters of the url on $params 

    ... 

}); 
+0

que parece -> middleware() no existe más? – Tobias

Respuesta

60

En Request objeto que tiene acceso a varias bolsas de parámetros, en particular:

  • $request->query - los parámetros GET
  • $request->request - el POST Parámetros
  • $request->attributes - Atributos de la solicitud (incluye parámetros analizados del PATH_INFO)

$request->query contiene sólo obtienen parámetros. city_id no es un parámetro GET. Es un atributo analizado desde PATH_INFO.

Silex usa varios Symfony Components. Las clases de solicitud y respuesta son parte de HttpFoundation. Más información al respecto de los documentos del Symfony:

+0

gracias kuba, me indicaste la solución. Lo he agregado a la pregunta. – fesja

+3

Una observación. Siempre use comparadores estrictos con strpos ("! ==" y no "! ="). Recuerde que null y 0 son "iguales" cuando se comparan con == (pero no son iguales en comparación con ===). –

Cuestiones relacionadas