Symfony:如何从FormType中的路由获取参数?

Mr.*_* B. 3 php symfony

我正在尝试page从中的当前路由访问参数FormType。它适用于Controller,但不适用于FormType。我想避免传递like /?page=1和preferred 参数/page/1

routing.yml

my_route:
    path: /data/page/{page}
    defaults:
        _controller: MyBundle:MyController:myAction
Run Code Online (Sandbox Code Playgroud)

src / myBundle / Form / Type / MyFormType.php

class MyFormType extends AbstractType {
    // ...
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $request = Request::createFromGlobals();
        $page    = $request->query->get('page');
        echo "page: $page"; // empty

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想避免将参数通过Controller传递给FormType,而是希望直接在FormType中访问它。

有任何想法吗?

提前致谢!

编辑: 关于所选答案;该page 属性是通过访问$request->attributes->get('page'),而不是通过$request->query->get('page')

小智 5

我不确定Yonel提供的答案是最好的,因为您向表单注入了依赖性。它有一些缺点,主要的恕我直言是,由于隐藏了对page参数的依赖性,这将使测试变得困难。

更好的解决方案是将其作为表单选项添加到表单中。

该请求对象已经在您的控制器中可用,您可能是通过以下方式创建表单的:

$form = $this->createForm(WhateverFormType::class, $entity)
Run Code Online (Sandbox Code Playgroud)

使用createForm方法,您可以注入第三个参数,这是要传递给表单的选项(即其他数据)。

因此,在您的控制器中:

$page = $request->query->get('page');
$form = $this->createForm(WhateverFormType::class, $entity, ['page' => $page]);
Run Code Online (Sandbox Code Playgroud)

然后在您的表单类型中,针对相同的问题,按照此答案中给出的示例进行操作:https : //stackoverflow.com/a/10922788/2721918