4

我正在使用食谱食谱在 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(),
));
4

3 回答 3

9

为了使第一个简单的(没有依赖注入)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() 似乎更好。

于 2012-11-07T14:03:58.830 回答
4

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

服务

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 的复杂表单配置来为我做这件事更清楚发生了什么,以及我的自定义类需要什么。

于 2012-07-25T16:44:30.297 回答
2

不要忘记

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',
    ));
于 2013-08-06T07:06:13.207 回答