【问题标题】:Symfony2.1 - The option "em" does not exist when using DataTransformerSymfony2.1 - 使用 DataTransformer 时选项“em”不存在
【发布时间】:2012-07-21 06:36:51
【问题描述】:

我正在使用 this 食谱食谱在 Symfon 2.1 中添加数据转换器,但我收到以下错误,The option "em" does not exist. Known options are: "attr", "block_name",....

这仍然是将实体管理器发送到表单类型的有效方式吗?

$taskForm = $this->createForm(new TaskType(), $task, array(
    'em' => $this->getDoctrine()->getEntityManager(),
));

【问题讨论】:

    标签: symfony-2.1 data-transfer-objects


    【解决方案1】:

    为了使第一个简单的(没有依赖注入)Transformer 的食谱工作,您应该添加“em”作为已知选项。您可以使用 setRequired() 方法将其添加到表单的类型类(食谱案例中的 TaskType)中,如下所示:

    class TaskType extends AbstractType {
        //...
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {   
            //...other stuff like $resolver->setDefaults(... if you need it
    
            $resolver->setRequired(array('em'));
        }
    }
    

    使用 $resolver->setDefaults() 添加 'em' 也可以,但在本食谱案例中需要实体管理器,因此使用 setRequired() 似乎更好。

    【讨论】:

      【解决方案2】:

      虽然我无法评论这是否是最好的方式,但我总是将它们作为硬依赖传递给我的任务构造函数...

      服务

      services:
          my_bundle.form.type.task:
              class: Company\MyBundle\Form\Type\TaskType
              arguments:
                  - @doctrine.orm.entity_manager
      

      控制器

      $form = $this->createForm($this->get('my_bundle.form.type.task'), $task);
      // or
      $form = $this->createForm(new TaskType($this->getDoctrine()->getEntityManager()));
      

      表单类型

      namespace Company\MyBundle\Form\Type;
      
      use Doctrine\ORM\EntityManager;
      use Symfony\Component\Form\AbstractType;
      // ...
      
      class TaskType extends AbstractType
      {
          protected $em;
      
          public function __construct(EntityManager $em)
          {
              $this->em = $em;
          }
      
          // ...
      }
      

      只要我的表单类型有任何依赖关系,我就会使用容器来管理它们。我个人发现这种方法比依靠 Symfony 的复杂表单配置来为我做这件事更清楚发生了什么,以及我的自定义类需要什么。

      【讨论】:

      • 如果您在 DI 配置中添加标签,您可以将控制器简化为 $this->createForm('my_bundle_task', $task)。见the documentation
      • $form = $this->createForm($this->get('my_bundle.form.type.task'), $task); // or $form = $this->createForm(new TaskType($this->getDoctrine()->getEntityManager())); 我不明白。您不能将任务和 EntityManager 作为参数传递?
      【解决方案3】:

      别忘了

      public function setDefaultOptions(OptionsResolverInterface $resolver)
      {
          $resolver->setDefaults(array(
              'data_class' => 'Acme\TaskBundle\Entity\Task',
          ));
      
          $resolver->setRequired(array(
              'em',
          ));
      
          $resolver->setAllowedTypes(array(
              'em' => 'Doctrine\Common\Persistence\ObjectManager',
          ));
      

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 2012-11-09
        • 2015-03-16
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 2014-06-22
        相关资源
        最近更新 更多