Symfony 验证约束注释不起作用

Symfony validation constraints annotations not working

我正在尝试使用注释进行 Symfony 表单验证,但我无法让它工作。无论约束如何,表单始终报告为有效。我在 PHP 7.3 运行 上使用 doctrine/annotations 1.13、symfony/validator 5.1 和 Symfony 5.1.5。

基本设置如下:

ProductionDependentCost.php

...
use Symfony\Component\Validator\Constraints as Assert;
...
    /**
     * @var float
     * @ORM\Column(type="float")
     * @Assert\NotNull
     * @Assert\Positive
     */
    private $costPerKW = 0;
...

ProductionDependentCostController.php

...
/**
     * @Route("/plant/{id}/productiondependentcosts", name="update_plant_production_dependent_costs", methods={"POST"})
     */
    public function updatePlantProductionDependentCosts(Plant $plant, Request $request): JsonResponse
    {
        $this->denyAccessUnlessGranted('view', $plant);
        $form = $this->createForm(ProductionDependentCostCollectionType::class, $plant, ['csrf_token_id' => 'vue-token']);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $this->em->flush();

            return $this->json('saved!');
        } elseif ($form->isSubmitted()) {
            return $this->json(ErrorUtil::parseErrors($form->getErrors(true)), Response::HTTP_BAD_REQUEST);
        }

        return $this->json('this should not be reached!', Response::HTTP_BAD_REQUEST);
    }
...

config/packages/framework.yaml

framework:
    ...
    validation:
      {
          enable_annotations: true
      }

我有更多注释约束,但在此示例中只包含一个,以免代码片段膨胀。无论我在表格中输入什么(例如,-1000 代表 costPerKW),它总是 return 和 'saved!'。我到处都看过,但似乎找不到解决方案。真心希望有人知道这个问题的答案。

表单在 Plant.php 的映射集合字段上使用 CollectionType。集合条目是 ProductionDependentCost.php 的实体,相应的 FormType 使用简单的映射字段 costPerKW.

我找到了解决问题的方法。 Symfony 表单不会自动验证集合中的实体。由于我的 ProductionDependentCost 是我表单中集合的一部分,我必须在我的集合字段中添加一个“有效”约束:

选项 1:

class Plant
{
...
     /**
     * @var ProductionDependentCost[]|Collection
     * @ORM\OneToMany(targetEntity=ProductionDependentCost::class, mappedBy="plant", orphanRemoval=true, cascade={"persist",
     * "remove"})
     * @Assert\Valid
     */
    private $productionDependentCosts;
...
}

选项 2:

class ProductionDependentCostCollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('productionDependentCosts', CollectionType::class,
            [
                ...
                'constraints' => [
                    new Valid(),
                ],
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Plant::class,
        ]);
    }
}

这将单独验证每个集合实体。