好像有些东西我听不懂。这将是一篇很长的文章,所以我会尽量简洁。
我尝试在Symfony 4.2中使用GroupSequence,但是我遇到了一个问题。我要实现的目标是添加一个未映射的字段并在FormType中定义GroupSequence(因为我想在此实体上使用另一个没有此未映射字段的FormType)。我希望在表单上的其他约束之前检查此未映射的字段“已验证”。
问题是在这种特殊情况下,我无法使用“组序列”来启用部分验证。
示例代码:https://github.com/sarramegnag/groupsequence-issue
这是我的实体代码:
<?php // src/Entity/Product.php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
*/
class Product
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*
* @Assert\NotBlank()
*/
private $name;
/**
* @ORM\Column(type="text")
*
* @Assert\NotBlank()
*/
private $description;
/**
* @ORM\Column(type="integer")
*
* @Assert\NotBlank()
*/
private $price;
...
我的表单类型代码:
<?php // src/Form/ProductType.php
namespace App\Form;
use App\Entity\Product;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\NotBlank;
class ProductType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('description')
->add('price')
->add('verified', CheckboxType::class, [
'mapped' => false,
'constraints' => [
new NotBlank(['groups' => ['Strict']]),
]
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Product::class,
'validation_groups' => new GroupSequence(['Strict', 'Product']),
]);
}
}
如果我在实体中设置属性和断言并将其映射为普通字段,它将起作用。
// src/Entity/Product.php
/**
* @Assert\NotBlank(groups={"Strict"})
*/
private $verified = false;
...
public function isVerified(): ?bool
{
return $this->verified;
}
public function setVerified(bool $verified): self
{
$this->verified = $verified;
return $this;
}
// src/Form/ProductType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('description')
->add('price')
->add('verified', CheckboxType::class)
;
}
事实上,只要我在实体中的断言上设置一个组,它就会起作用。
感谢您的时间,如果我不太清楚,请告诉我。
纪尧姆