web-dev-qa-db-fra.com

Symfony - génère une URL avec le paramètre dans le contrôleur

Je veux générer une URL directement dans mon contrôleur. Je souhaite utiliser une URL définie dans mon fichier routing.yml qui nécessite un paramètre.

J'ai trouvé ce code dans le livre de recettes (section Routage):

$params = $router->match('/blog/my-blog-post');
// array('slug' => 'my-blog-post', '_controller' => 'AcmeBlogBundle:Blog:show')

$uri = $router->generate('blog_show', array('slug' => 'my-blog-post'));
// /blog/my-blog-post

Mais je ne comprends pas à quoi se réfère le $ routeur. Évidemment, ça ne marche pas. Existe-t-il un moyen simple de générer une URL de routage avec un paramètre dans un contrôleur?

50
user2094540

C'est assez simple:

public function myAction()
{
    $url = $this->generateUrl('blog_show', array('slug' => 'my-blog-post'));
}

Dans une action, $ this-> generateUrl est un alias qui utilisera le routeur pour obtenir la route demandée. Vous pouvez également le faire de la même manière:

$this->get('router')->generate('blog_show', array('slug' => 'my-blog-post'));
108
Sybio

Si vous voulez des URL absolues, vous avez le troisième paramètre.

$product_url = $this->generateUrl('product_detail', 
    array(
        'slug' => 'slug'
    ),
    UrlGeneratorInterface::ABSOLUTE_URL
);

N'oubliez pas d'inclure UrlGeneratorInterface.

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
18
Pedro Casado

Obtenez le routeur du conteneur.

$router = $this->get('router');

Ensuite, utilisez le routeur pour générer l'URL

$uri = $router->generate('blog_show', array('slug' => 'my-blog-post'));
12
Jon Winstanley

assurez-vous que votre contrôleur s'étend sur Symfony\Bundle\FrameworkBundle\Controller\Controller;

vous devriez aussi vérifier app/console debug:router dans le terminal pour voir quel nom symfony a nommé la route

dans mon cas, il a utilisé un moins au lieu d'un trait de soulignement

c'est-à-dire blog-show

$uri = $this->generateUrl('blog-show', ['slug' => 'my-blog-post']);
3
Edwin Ikechukwu