具有非映射字段的表单中的Symfony 3唯一约束

时间:2017-07-21 13:17:04

标签: php symfony

我正在使用Symfony 3而我正在使用没有映射实体的表单,data_class => null就像:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstname', null, ['label' => 'user.edit.label.firstname'])
            ->add('lastname', null, ['label' => 'user.edit.label.lastname'])
            ->add('email', EmailType::class, ['label' => 'common.email', ])
            ->add('state', ChoiceType::class, [
                'label' => 'common.state',
                'choices' => array_flip(CompanyHasUser::getConstants())
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => null,
            'translation_domain' => 'messages'
        ));
    }

因此,如何限制我的字段'email'是唯一的?我需要在我的实体User(attribute = email)中检查它。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果没有映射的实体,则必须检查数据库。最简单的方法是将UserRepository注入表单类。 (Inject a repository link。)

在您的存储库中,创建一个查询方法,以确保电子邮件尚不存在。这很容易返回布尔值true或false。

在表单中,创建自定义约束回调。

public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'         => null,
            'translation_domain' => 'messages',
            'constraints'        => [
                new Callback([
                    'callback' => [$this, 'checkEmails'],
                ]),
            ]))
        ;
    }

使用UserRepo在同一表单类中添加回调函数。

/**
 * @param $data
 * @param ExecutionContextInterface $context
 */
public function checkEmails($data, ExecutionContextInterface $context)
{
    $email = $data['email'];
    if ($this->userRepository->checkEmail($email)) {
        $context->addViolation('You are already a user, log in.');
    }
}

另见blog post on callback constraints without an entity