0

我在我的 FormType 中使用它

->add('Task', 'entity', array(
                 'class' => 'Task',
                 'query_builder' => function(EntityRepository $er) use ($options) {
                                     return $er->createQueryBuilder('t') 
                                     ->where('t.id = :id')
                                     ->setParameter('id',$options['id'])

现在为了让它工作,我需要在控制器的表单类型中传递 id

$form = $this->createForm(new TaskType(), $task,array('id' => $id));

现在它可以很好地显示我的所有选项。但后来我忘记了我也需要在newAction控制器的功能中放入同样的东西。

我还需要在 EditAction 和 Update 操作中添加相同的内容

所以这意味着我必须在四个地方重复这一点。

此外,如果我有 4 行计算,$id那么我必须在四个地方重复所有这些步骤。

最重要的是,当我编辑我的表单时,我的选择没有在我的选择框中预先选择。

然后我必须先设置对象,然后再显示在编辑表单中。

但是,如果我在没有任何这样的查询的情况下使用它

->add('user')

然后它可以毫无问题地工作,也可以使用编辑功能。

难道我做错了什么

4

1 回答 1

1

存在于newActionid中,我想它不依赖于用户,也不是从 url 中检索到的。在这种情况下:

案例 1:没有从 url 中检索到 id:

解决方案 1:将 entityManager 直接注入表单并执行表单中的逻辑,这样您就不必在控制器中重复此操作。

1-直接在表单中执行逻辑。id在构造函数中添加检索您所需的服务。

2-将表单声明为服务,并注入所需的服务(通常是entityManager)以id直接获取。

解决方案2: 在实体管理器中生成逻辑。创建一个接受id并为您创建表单的函数。这样,您总是在不同的控制器中使用相同的功能。

案例2:从url中获取id:

如果它是从 url 获得的,您仍然必须在选项中传递 id 或在构造函数中传递 id。将 id 作为选项传递并不一定意味着您正在重复您的代码。它只是成为必需品,所以必须这样做。

于 2012-08-24T07:40:20.580 回答