我目前正在进行我的第一个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实体管理器? 或者你会推荐一种完全不同的方法吗?
答案 0 :(得分:0)
您可以为此用例编写自己的自定义约束和验证程序类。
https://symfony.com/doc/current/validation/custom_constraint.html
验证器是一项服务,因此您可以根据需要注入任何其他服务。 (即实体经理)。 这样您的表单就不必处理验证逻辑本身。