web-dev-qa-db-fra.com

Symfony2: Comment passer des paramètres de requête de chaîne 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 chaîne de requête dans les routes dans Symfony2 afin qu'ils puissent être passés dans un contrôleur.

Par exemple, au lieu de générer un URI comme /blog/my-blog-post (de Symfony2 documentation de routage ) et en le 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 où définir le paramètre slug dans le fichier de configuration de la route (comme son homologue {slug} ci-dessus).

Peut-être que c'est exprès, mais alors quelle est la meilleure pratique pour travailler avec les paramètres GET dans la chaîne de requête?

La documentation en fait mention dans Génération d'URL avec des chaînes de requête , alors comment les passer dans le contrôleur?

Où je peux les mentionner, c'est Symfony2 et HTTP Fundamentals :

use Symfony\Component\HttpFoundation\Request;

$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
jcroll

Pour travailler avec les paramètres GET/POST dans un contrôleur qui étend 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 contrôleur qui n'étend pas le contrôleur de base Symfony, déclarez l'objet de demande 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
    ...
}
46
redbirdo

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 simplement à partir de l'objet $ request dans votre contrôleur: $request->query->get('foo'); (sera null s'il n'existe pas).

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

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

Si vous souhaitez générer un itinéraire dans votre contrôleur, c'est comme dans la documentation que vous avez liée:

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

va générer l'itinéraire /blog/2?category=Symfony (les paramètres qui n'existent pas dans la définition de l'itinéraire seront transmis sous forme de chaînes de requête).

28
Nanocom