56

我想直接在我的控制器中生成一个 Url。我想使用在我的 routing.yml 文件中定义的需要参数的 url。

我在 Cookbook(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

但我不明白什么是引用 $router。显然,它不起作用。有没有一种简单的方法可以在控制器中生成带有参数的路由 url?

4

4 回答 4

120

这很简单:

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

在一个动作中,$this->generateUrl 是一个别名,它将使用路由器来获取想要的路由,你也可以这样做:

$this->get('router')->generate('blog_show', array('slug' => 'my-blog-post'));
于 2013-11-18T14:47:55.223 回答
19

如果你想要绝对网址,你有第三个参数。

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

请记住包含 UrlGeneratorInterface。

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
于 2016-10-06T14:00:08.093 回答
13

从容器中获取路由器。

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

然后使用路由器生成Url

$uri = $router->generate('blog_show', array('slug' => 'my-blog-post'));
于 2013-11-18T14:47:48.797 回答
3

确保您的控制器扩展Symfony\Bundle\FrameworkBundle\Controller\Controller;

您还应该检查app/console debug:router终端以查看 symfony 为该路线命名的名称

就我而言,它使用减号而不是下划线

IEblog-show

$uri = $this->generateUrl('blog-show', ['slug' => 'my-blog-post']);
于 2017-09-20T10:47:55.470 回答