【发布时间】:2016-08-31 10:27:02
【问题描述】:
我正在使用数据转换器实现自定义表单类型,以根据http://symfony.com/doc/2.8/form/data_transformers.html 实现多对多关系
class ClientType extends AbstractType
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('shortname')
->add('shortinfo')
->add('web')
->add('user', CollectionType::class, array(
'entry_type' => IntegerType::class,
'allow_add' => true,
'allow_delete' => true
));
$builder->get('user')->addModelTransformer(new UserToPrimaryKeyTransformer($this->manager));
}
}
子类型UserType是:
class UserType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('loginname')
->add('firstname')
->add('lastname')
/* ... */
->add('email')
->add('id')
;
}
}
transformer 类几乎是从文档中复制粘贴的:
class UserToPrimaryKeyTransformer implements DataTransformerInterface
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
/**
* Transform entity to pkid
*
* @param User
* @return integer
*/
public function transform($user)
{
if(null === $user) {
return -1;
}
return $user->getId();
}
/**
* @param integer $pkid
*/
public function reverseTransform($pkid)
{
if (!$pkid) {
return;
}
$user = $this->manager
->getRepository('AcmeBundle:User')
// query for the user with this id
->find($pkid)
;
if (null === $user) {
/* ... */
}
return $user;
}
}
上下文就这么多。然而,问题似乎在于服务定义,正是 Doctrine Entity Manager 的注入:
acme.form.type.client:
class: AcmeBundle\Form\ClientType
arguments: [ @doctrine.orm.entity_manager ]
tags:
- { name: form.type }
现在,当我发布此表单时,我得到:
Type error: Argument 1 passed to AcmeBundle\Form\ClientType::__construct() must implement interface Doctrine\Common\Persistence\ObjectManager, none given
关于发生了什么的任何想法或指示? @doctrine.orm.entity_manager 变量是否必须在某处实例化?
我在 Symfony 2.8 上,顺便说一句
【问题讨论】:
-
您的服务定义有误吗?因为你说的是
AcmeBundle\Form\ClientType而不是AcmeBundle\Form\ CrmClientType -
不,对不起...忘记简化那个...在这两种情况下都应该是
AcmeBundle\Form\ClientType
标签: forms symfony doctrine symfony-2.8