我使用这个食谱在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(),
));
要使第一个简单的(没有依赖注入)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->setDefault()添加"em"也可以,但在本食谱中,需要实体管理器,因此使用setRequired()似乎更好。
虽然我不能评论这是否是最好的方法,但我总是将它们作为硬依赖项传递给我的任务构造函数。。。
服务
services:
my_bundle.form.type.task:
class: CompanyMyBundleFormTypeTaskType
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 CompanyMyBundleFormType;
use DoctrineORMEntityManager;
use SymfonyComponentFormAbstractType;
// ...
class TaskType extends AbstractType
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
// ...
}
只要我的表单类型有任何依赖项,我就会使用容器来管理它们。我个人发现这个方法比依赖Symfony复杂的表单配置更清楚地了解发生了什么,以及我的自定义类需要什么
不要忘记
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AcmeTaskBundleEntityTask',
));
$resolver->setRequired(array(
'em',
));
$resolver->setAllowedTypes(array(
'em' => 'DoctrineCommonPersistenceObjectManager',
));