-->

Symfony2.1 - 选项“EM”不使用DataTransformer存在时(Symfony2

2019-09-20 01:19发布

我使用这个食谱配方在Symfon 2.1添加数据转换,但我得到以下错误, The option "em" does not exist. Known options are: "attr", "block_name",.... The option "em" does not exist. Known options are: "attr", "block_name",....

这是仍然在发送实体管理表单类型的有效方法是什么?

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

Answer 1:

而如果这是最好的办法还是没有我不能发表评论,我总是他们传递给我的任务建构作为硬依赖...

服务

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的复杂的形式配置,为我做什么。



Answer 2:

为了使第一个简单的(不依赖注入)变压器的食谱配方工作,你应该添加“EM”作为一种已知的选择。 您可以在表单的类型类(任务类型在菜谱的情况下),使用它添加setRequired()方法是这样的:

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

        $resolver->setRequired(array('em'));
    }
}

添加“时间”与$ resolver-> setDefaults()也将工作,但在这种情况下,食谱需要实体管理器等用setRequired()似乎更好。



Answer 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',
    ));


文章来源: Symfony2.1 - The option “em” does not exist when using DataTransformer