我的项目是在Symfony 2.6上。
我有一个实体Request
,其集合为User
contributers
。
我有一个表单,以便向contributer
添加request
。此表单包含数据转换器,以便通过其email
添加用户。
当我想:
时,一切正常创建一个新的request
,email
对应于:
user
。user
:系统会显示一条错误消息,通知用户此email
与现有的user
不匹配。通过
更新现有的request
contributer
,其中email
对应
user
。user
:系统会显示一条错误消息,通知用户此email
与现有的user
不匹配。contributer
对应的新email
user
。但是,当我想通过添加与{not} request
对应的contributer
的新email
更新现有user
时,它会崩溃:{{1} }
以下是解决此问题的解决方法:在我的Catchable Fatal Error: Argument 1 passed to AppBundle\Entity\Request::addContributer() must be an instance of AppBundle\Entity\User, null given, called in C:\Users\Utilisateur\Workspace\repositories\tvjp\web-app-ws\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php on line 512 and defined
实体中,我修改了我的Request
方法,以便接受空addContributer
:
此代码不起作用:
User
此代码有效:
public function addContributer(User $contributer){
$this->contributers[] = $contributer;
return $this;
}
但我认为这是一个非常脏的解决方法。我在这里缺少什么想法?
有关信息,请参阅以下部分代码。
datatransformer
public function addContributer(User $contributer = null){
if($contributer != null){
$this->contributers[] = $contributer;
}
return $this;
}
用户选择器
class UserByEmailTransformer implements DataTransformerInterface{
private $entityManager;
public function __construct(EntityManager $entityManager){
$this->entityManager = $entityManager;
}
public function reverseTransform($email) {
if (!$email) { return new User(); }
$user = $this->entityManager->getRepository('AppBundle:user')->findOneBy(array('email' => $email));
if ($user === null) {
throw new TransformationFailedException('Il n\'existe aucun utilisateur '.$email.'.');
}
return $user;
}
public function transform($user) {
if ($user === null) { return ''; }
return $user->getEmail();
}
}
服务
class UserSelectorType extends AbstractType{
private $entityManager;
public function __construct(EntityManager $entityManager){
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options){
$transformer = new UserByEmailTransformer($this->entityManager);
$builder->addModelTransformer($transformer);
}
public function setDefaultOptions(OptionsResolverInterface $resolver){
$defaults = array();
$resolver->setDefaults($defaults);
}
public function getParent(){
return 'email';
}
public function getName(){
return 'userSelector';
}
}
表格
user_selector_form_type:
class: AppBundle\Form\Selector\UserSelectorType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type, alias: userSelector }