Symfony - 在控制器中生成带参数的url

时间:2013-11-18 14:41:08

标签: symfony symfony-routing

我想直接在我的控制器中生成一个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 个答案:

答案 0 :(得分:106)

这很简单:

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'));

答案 1 :(得分:16)

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

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

请记住包含UrlGeneratorInterface。

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

答案 2 :(得分:12)

从容器中获取路由器。

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

然后使用路由器生成Url

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

答案 3 :(得分:3)

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

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

在我的情况下,它使用了减号而不是下划线

blog-show

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