Symfony2: Comment passer les paramètres de querystring d'url aux contrôleurs?

peut-être que je manque quelque chose mais il ne semble pas y avoir de moyen de définir les paramètres de querystring dans les routes dans Symfony2 pour qu'ils puissent être passés dans un contrôleur.

par exemple, au lieu de générer une URI comme /blog/my-blog-post (à partir de Symfony2 documentation de routage) et en passant à la route suivante:

# app/config/routing.yml    
blog_show:
    pattern:   /blog/{slug}
    defaults:  { _controller: AcmeBlogBundle:Blog:show }

je préfère générer un URI comme /blog?slug=my-blog-post. Le problème est que je ne trouve nulle part pour définir le slug paramètre dans le fichier de configuration de route (comme sa contrepartie {slug} ci-dessus).

peut-être que c'est fait exprès, mais alors quelle est la meilleure pratique pour travailler avec les paramètres GET dans le queserystring?

La documentation ne font mention d'eux dans Génération d'Url avec des Chaînes de Requête, alors comment les passer dans le contrôleur?

Où je peux trouver la mention d'entre eux est les Fondamentaux de Symfony2 et HTTP:

use SymfonyComponentHttpFoundationRequest;

$request = Request::createFromGlobals();

// retrieve GET variables
$request->query->get('foo');

Est-ce la meilleure pratique pour travailler avec eux à l'intérieur du contrôleur?

19
demandé sur jcroll 2012-07-24 01:24:41

2 réponses

Pour travailler avec GET / POST des paramètres d'un contrôleur qui s'étend de Symfony\Bundle\FrameworkBundle\Controller\Controller:

public function updateAction()
{
    $request = $this->getRequest();
    $request->query->get('myParam'); // get a $_GET parameter
    $request->request->get('myParam'); // get a $_POST parameter
    ...
}

pour un controller qui n'étend pas le controller de base Symfony, déclarez l'objet request comme paramètre de la méthode d'action et procédez comme ci-dessus:

public function updateAction(Request $request)
{
    $request->query->get('myParam'); // get a $_GET parameter
    $request->request->get('myParam'); // get a $_POST parameter
    ...
}
44
répondu redbirdo 2012-07-23 21:39:52

vous ne pouvez pas spécifier vos paramètres de chaîne de requête dans les fichiers de configuration de routage. Vous les obtenez à partir de l'objet $ request dans votre controller:$request->query->get('foo'); (null si elle n'existe pas).

Et pour générer une route avec un paramètre donné, vous pouvez le faire en vous les templates twig comme ça :

{{ path(route, query|merge({'page': 1})) }}

si vous voulez générer une route dans votre controller, c'est comme dans la documentation que vous avez liée:

$router->generate('blog', array('page' => 2, 'category' => 'Symfony'));

générera la route /blog/2?category=Symfony (les paramètres qui n'existent pas dans la définition de route seront passés en chaîne de requête).

27
répondu Nanocom 2014-05-20 12:33:10