更新Symfony上集合字段上具有datatransformer的实体

时间:2015-03-01 16:57:15

标签: symfony collections entity transformer

我的项目是在Symfony 2.6上。

我有一个实体Request,其集合为User contributers

我有一个表单,以便向contributer添加request。此表单包含数据转换器,以便通过其email添加用户。

当我想:

时,一切正常
  • 创建一个新的requestemail对应于:

    • 现有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 }

0 个答案:

没有答案