21

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

例如,不要生成类似/blog/my-blog-post(来自 Symfony2 的路由文档)的 URI 并将其传递给以下路由:

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

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

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

文档在使用查询字符串生成 URL中确实提到了它们,那么如何将它们传递给控制器​​?

我可以找到提到它们的地方是Symfony2 和 HTTP Fundamentals

use Symfony\Component\HttpFoundation\Request;

$request = Request::createFromGlobals();

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

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

4

2 回答 2

47

在扩展 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
    ...
}
于 2012-07-23T21:39:52.847 回答
29

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

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

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

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

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

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

于 2012-07-23T21:29:57.680 回答