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,
]);
}
}
这将单独验证每个集合实体。
我正在尝试使用注释进行 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,
]);
}
}
这将单独验证每个集合实体。