繁体   English   中英

嵌套表单/映射字段到实体

[英]Nested Form / Mapping field to entity

我正在寻找最好的(或只是工作)方式来解决以下问题。 我喜欢标准的UserType表单

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'username',
            Type\TextType::class
        )
        ->add(
            'email',
            Type\EmailType::class
        )
        ->add(
            'plainPassword',
            Security\UserRepeatedPasswordType::class
        )
        ->add(
            'roles',
            Type\ChoiceType::class,
            [
                'multiple' => true,
                'expanded' => true,
                'choices' => $this->getRoleChoices()
            ]
        );
}

什么是非标准的UserRepeatedPasswordType ,它看起来像这样

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'password',
            Type\RepeatedType::class,
            [
                'type' => Type\PasswordType::class,
                'required' => true,
                'first_options'  => [
                    'label' => 'Password'
                ],
                'second_options' => [
                    'label' => 'Repeat Password'
                ],
            ]
        );
}

我创建它是因为这两个字段也用于passwordReset表单和userSettings表单。 现在我有两个问题:

1.)当我以这种方式使用它时, UserRepeatedPasswordType值未正确映射到我的User实体 - 有一个错误,即字符串是预期的(duh;)但它有数组。 我尝试使用View和Model变换器但没有正确的结果(但我对这些没有太多经验,所以可能就是这种情况)。 我也尝试用getParent()进行实验,然后传递给UserType但它进入了一些无限循环,我得到了500.如果我只是将UserRepeatedPasswordType粘贴字段复制到UserTypeUserRepeatedPasswordType正常工作。

2.)如果这个问题得到解决(或者甚至通过复制粘贴,如果不能以其他方式完成),还有另一个相关的(我相信)问题:

我有这个ChangePasswordType表单,用于重置密码。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'confirmationToken',
            Type\HiddenType::class,
            [
                'required' => true,
                'constraints' => [
                    new NotBlank(),
                ]
            ]
        )
        ->add(
            'plainPassword',
            Type\RepeatedType::class,
            [
                'type' => Type\PasswordType::class,
                'required' => true,
                'first_options'  => [
                    'label' => 'Password'
                ],
                'second_options' => [
                    'label' => 'Repeat Password'
                ],
            ]
        )
        ->add(
            'changePassword',
            Type\SubmitType::class
        );
}

并且它工作得很好但是我想用它做两件事 - 首先,解决我的第一个问题并在其中使用UserRepeatedPasswordType ,第二个 - 我在$plainPassword上的User实体中完成了一些Assert\\Length ,它在我运行时正常工作通过UserType表单提交新用户。 但我希望验证有些映射到ChangePasswordType或理想情况下映射到UserRepeatedPasswordType - 只是将所有规则放在一个地方。 甚至可以这样做吗? 感谢您提供任何解决方案/提示/建议。

好吧,不知道是否有人感兴趣,但这就是我完成这个的方式。 如果有人有更好的答案,请给我一个标志(主要是给第一个);)

1.)正如我所想,由ViewTransformer解决,但是以父表单形式解决(在UserType不在UserRepeatedPasswordType

$builder->get('plainPassword')
    ->addViewTransformer(new CallbackTransformer(
        function ($singleAsArray) {
            return $singleAsArray;
        },
        function ($arrayAsSingle) {
            return $arrayAsSingle['password'] ?? '';
        }
    ));

2.)这实际上非常简单。 您所要做的就是以与UserType相同的方式将该表单映射到UserEntity,并制作自定义验证组,以使一切都很好并受到控制:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM