Symfony 3表单验证:检查现有数据库条目

时间:2017-09-15 14:42:12

标签: php forms symfony validation doctrine

我目前正在进行我的第一个Symfony项目,并且正在努力实现我想要实现的特殊功能 我有一个表格,人们必须输入许可证密钥和其他数据以激活某项服务 提交表单时,我需要验证所有数据,验证的一部分是检查给定的许可证密钥是否有效(存在于许可证密钥的数据库中)。

我的表单位于一个单独的表单类中,看起来像这样(剥离到重要部分):

<?php

namespace AppBundle\Form;

use AppBundle\Entity;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Constraint;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

class Activation extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Entity\Customer::class,
            'translation_domain' => 'forms'
        ]);
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('activationCode', Type\TextType::class, [
                'mapped' => false,
                'constraints' => [new Constraint\Callback(
                    function ($object, ExecutionContextInterface $context, $payload) {

                    }
                )]
            ])
            ->add('firstName', Type\TextType::class)
            ->add('lastName', Type\TextType::class)
            ->add('email', Type\RepeatedType::class, [
                'type' => Type\EmailType::class,
                'invalid_message' => 'The E-Mail fields must match.',
                'first_options' => ['label' => 'E-Mail'],
                'second_options' => ['label' => 'Repeat E-Mail'],
            ])
            ->add('activate', Type\SubmitType::class);
    }

}

正如您所看到的,我的第一个想法是使用Callback Constraint并在Closure中进行检查 这是一个适当的方法吗? 如果是这样,我如何从该闭包内部访问数据库/ doctrine实体管理器? 或者你会推荐一种完全不同的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以为此用例编写自己的自定义约束和验证程序类。

https://symfony.com/doc/current/validation/custom_constraint.html

验证器是一项服务,因此您可以根据需要注入任何其他服务。 (即实体经理)。 这样您的表单就不必处理验证逻辑本身。