Symfony2:如何将url查询字符串参数传递给控制器​​?

时间:2012-07-23 21:24:41

标签: url symfony parameters routing query-string

也许我错过了一些东西,但似乎没有办法在Symfony2中的路由中定义查询字符串参数,以便它们可以传递给控制器​​。

例如,不是生成像/blog/my-blog-post这样的URI(来自Symfony2的routing documentation)并将其传递给以下路径:

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

我希望生成类似/blog?slug=my-blog-post的URI。问题是我找不到任何地方在路由配置文件中定义slug参数(如上面的{slug}对应文件)。

也许这是故意的,但是在查询字符串中使用GET参数的最佳做法是什么?

文档确实在Generating URLs with Query Strings中提到了它们,那么如何将它们传递给控制器​​呢?

我可以在哪里找到它们Symfony2 and HTTP Fundamentals

use Symfony\Component\HttpFoundation\Request;

$request = Request::createFromGlobals();

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

这是在控制器内使用它们的最佳做法吗?

2 个答案:

答案 0 :(得分:46)

在扩展Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller的控制器中使用GET / POST参数:

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

对于不扩展Symfony基本控制器的控制器,将请求对象声明为操作方法的参数,并按上述步骤操作:

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

答案 1 :(得分:27)

您无法在路由配置文件中指定查询字符串参数。 您只需从控制器中的$ request对象中获取它们:$request->query->get('foo'); (如果不存在,将为null。)

要生成具有给定参数的路线,您可以在您的枝条模板中执行此操作:

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

如果您想在控制器中生成路线,就像您链接的文档一样:

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

将生成路由/blog/2?category=Symfony(路由定义中不存在的参数将作为查询字符串传递)。