【问题标题】:Symfony 5 UniqueEntity Form Validation ConstraintsSymfony 5 UniqueEntity 表单验证约束
【发布时间】:2021-04-04 06:26:51
【问题描述】:

我正在使用 Symfony 表单来创建和验证我的表单我没有在实体中使用断言我在表单中使用约束。使用 UniqueEntity 时出现问题,无法将实体或存储库与约束相关联。

我的表单类型

<?php

namespace App\Form;

use App\Entity\Business;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;

class BusinessNameFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('business_title', TextType::class, [
                "label" => "Business Title",
                "help"  => "This will be the name of your workspace.",
                "constraints" => [
                    new NotBlank(),
                    new Length(['min' => 3]),
                    new Regex([
                        'pattern' => '/^[a-z0-9]+$/',
                        'match'   => True,
                        'message' => 'Only a-z, 0-9 values are allowed.'
                    ]),
                    new UniqueEntity([
                        'entityClass' => Business::class,
                        'fields' => 'title'
                    ]),
                ]
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}

我的控制器

<?php


namespace App\Controller;


use App\Form\BusinessNameFormType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/register", name="register_")
 * Class RegisterBusinessController
 */
class RegisterBusinessController extends AbstractController
{
    /**
     * @Route("/step-one", name="step_one")
     * @param Request $request
     * @return Response
     */
    public function stepOne(Request $request): Response
    {

        $businessNameForm = $this->createForm(BusinessNameFormType::class);
        $businessNameForm->handleRequest($request);
        if($businessNameForm->isSubmitted() && $businessNameForm->isValid()){
            dd($businessNameForm->getData());
        }

        return $this->render("security/register_business/step_one.html.twig", [
           'businessNameForm' => $businessNameForm->createView()
        ]);

    }
}

之后在验证错误时出现错误。

【问题讨论】:

  • 您的表单中有一个 TextType,并且约束需要一个实体,因此使用 EntityType 可能会更好。您可以尝试使用 DataTransformer 或表单事件来获取实体对象,或者您可以编写一个自定义约束,使用 Doctrine 来检查是否已经存在具有该标题的业务

标签: php symfony symfony5


【解决方案1】:

UniqueEntity 必须应用于实体(而不是字段)。但是你可以在 setDefaults 中使用它:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'constraints' => [
            new UniqueEntity([
                'entityClass' => Business::class,
                'fields' => 'title',
            ]),
        ],

此外,您的表单字段似乎应该命名为“title”而不是“business_title”。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 2017-03-10
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多