Php Symfony数据转换和使用数据更新表单

Php Symfony数据转换和使用数据更新表单,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,两个实体之间存在一对一的关系。第一个是用户实体,第二个是域实体。一个用户可以有多个域 这是用户实体(已删除其他字段,因为与主题无关): 这是UserDomains实体(某些字段已被删除): 必须在向系统注册用户时添加域。我有登记表的登记类型。此类型表单类具有DataTransformer,用于添加注册用户的域 RegisterType类位于此处: class RegistrationType extends AbstractType { public function buildForm

两个实体之间存在一对一的关系。第一个是用户实体,第二个是域实体。一个用户可以有多个域

这是用户实体(已删除其他字段,因为与主题无关):

这是UserDomains实体(某些字段已被删除):

必须在向系统注册用户时添加域。我有登记表的登记类型。此类型表单类具有DataTransformer,用于添加注册用户的域

RegisterType类位于此处:

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('fullName', 'text', array('attr' => array('class' => 'form-control'), 'label' => 'user_register.fullname', 'translation_domain' => 'UsersBundle'))
            ->add('domains', 'text', array('attr' => array('class' => 'form-control select2', 'id' => 'select2_sample1')))
        ;

        $builder->get('domains')->addModelTransformer(new CallbackTransformer(
            function(){
                return '';
            },
            function($data){

                $arrCollection = new ArrayCollection();

                if (strpos($data, ",") !== false) {
                    $expData = explode(',', $data);
                    foreach ($expData as $domain) {
                        $domainObj = new UserDomains();
                        $domainObj->setName($domain);
                        $domainObj->setEnabled(true);
                        $arrCollection->add($domainObj);
                    }
                } else if (!empty($data)) {
                    $domain = new UserDomains();
                    $domain->setName($data);
                    $domain->setEnabled(true);
                    $arrCollection->add($domain);
                }

                return $arrCollection;
            }
        ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MyBundle\Entity\Users',
            'intention'  => 'registration',
        ));
    }

    public function getParent()
    {
        return 'fos_user_registration';

        // Or for Symfony < 2.8
        // return 'fos_user_registration';
    }

    public function getName()
    {
        return 'user_registration';
    }
}
类注册类型扩展了AbstractType
{
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$builder
->添加('fullName','text',array('attr'=>array('class'=>'form control'),'label'=>'user\u register.fullName','translation\u domain'=>'UsersBundle'))
->添加('domains','text',array('attr'=>array('class'=>'formcontrolselect2','id'=>'select2\u sample1'))
;
$builder->get('domains')->addModelTransformer(新CallbackTransformer(
函数(){
返回“”;
},
功能(数据){
$arrCollection=newarraycollection();
if(strpos($data,“,”)!==false){
$expData=分解(“,”,$data);
foreach($expData作为$domain){
$domainObj=新用户域();
$domainObj->setName($domain);
$domainObj->setEnabled(true);
$arrCollection->add($domainObj);
}
}如果(!empty($data)){
$domain=新用户域();
$domain->setName($data);
$domain->setEnabled(true);
$arrCollection->add($domain);
}
退回$1元;
}
));
}
公共函数配置选项(选项解析器$resolver)
{
$resolver->setDefaults(数组(
“数据\u类”=>“MyBundle\Entity\Users”,
“意向”=>“注册”,
));
}
公共函数getParent()
{
返回“fos_用户注册”;
//或对于Symfony<2.8
//返回“fos_用户注册”;
}
公共函数getName()
{
返回“用户注册”;
}
}
因此,任何人填写登记表并提交。用户创建了域并将其添加到User_domains表中,但不更新必须是新用户id的用户字段。如何自动执行此操作?或者你有没有想法用新用户的id更新用户域的用户


感谢对所有StackoverFlow的帮助:)

向RegistrationType添加如下构造:

class RegistrationType extends AbstractType
{
    private $user;

    public  function  __construct(Users $user) {
        $this->user = $user;
    }
将setUser函数添加到DataTransform中,如下所示:

$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);
最后,按如下方式更新控制器:

$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);

向RegistrationType添加如下构造:

class RegistrationType extends AbstractType
{
    private $user;

    public  function  __construct(Users $user) {
        $this->user = $user;
    }
将setUser函数添加到DataTransform中,如下所示:

$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);
最后,按如下方式更新控制器:

$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);

在User::addDomain add$domain->setUser($this)中;我发现你的问题有点让人困惑,但我想这就是你的要求。这并没有解决我的问题。问题是当用户实体保存时,它必须保存到具有新用户id的UserDomains实体。我认为您的基本方法是有缺陷的。看看表单集合:在User::addDomain add$domain->setUser($this)中;我发现你的问题有点让人困惑,但我想这就是你的要求。这并没有解决我的问题。问题是当用户实体保存时,它必须保存到具有新用户id的UserDomains实体。我认为您的基本方法是有缺陷的。看看表单集合:请注意,这种方法不适用于Symfony 3。如果你真的觉得有必要这样做,那么通过createForm中的options参数传递$user。如果您确实觉得有必要这样做,那么通过createForm中的options参数传递$user。