【发布时间】: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 来检查是否已经存在具有该标题的业务