英文:
Error is not bind on the CollectionType field but on the root FormType
问题
我尝试创建一个简单的表单,其中包含几种不同的FormType
以及在FormType
类中使用验证器(但如果我在实体上编写验证器,同样的问题也会出现)。
所以我有一个实体叫做“Phase”:
class Phase(省略了Doctrine注释和getter/setter)
{
private int $idPhase;
private ?DateTimeInterface $dtDue = null;
private int $nbNoticeDaysExpert = 7;
private int $nbNoticeDaysMember = 7;
}
我有一个包含这个第一个实体“Phase”集合的“父”实体“Call”:
class Call(省略了Doctrine注释和getter/setter)
{
private ?int $idCall = null;
private ?string $acronym = null;
private ?Call $previousCall = null;
private Collection $phases;
public function __construct()
{
$this->phases = new ArrayCollection();
}
}
我创建了基本的约束和验证器类,并且在我的示例中,将其附加到我的FormType
的每个属性上:
class PhaseUniqueByCallValidator extends ConstraintValidator
{
public function validate(mixed $value, Constraint $constraint): void
{
$this->context->buildViolation('paffffff')->addViolation();
return;
}
}
我注意到,如果我使用Symfony验证器(例如Count
),完全相同的情况会发生。
我像往常一样创建了表单类型:
class CallType extends AbstractType
{
$builder
->add('lbAcronyme', TextType::class, [
'required' => true,
'constraint' => [new PhaseUniqueByCall()],
])
->add('previousCall', EntityType::class, [
'class' => Call::class,
'constraint' => [new PhaseUniqueByCall()],
])
->add('phases', CollectionType::class, [
'entry_type' => Phase::class,
'constraint' => [new PhaseUniqueByCall()],
])
}
所以这就是我的问题,CollectionType
的错误不会呈现在HTML中的字段下,因为它没有附加到FormType
的CollectionType
。
当我在Twig中进行转储时,我可以看到根节点上的错误。
所以我可能忘了指定某些东西吗?我搜索了几个小时(也许是错的,哈哈),但我没有找到与我有相同问题的人,也没有在Symfony Git的问题中找到。
我甚至尝试阅读供应商代码以查找错误附加到FormType
的位置,但代码太多了,我没有找到。
我尝试使用ConstraintViolationBuilder
类的atPath
函数来处理,但没有成功,我也没有找到明确的示例来使用它。
$this->context->buildViolation($constraint->messageFirst)
->atPath('phases')
->addViolation();
英文:
I tried to make a simple Form with several different FormType with Validators in the FormType class (but same problem appears if i write validators on entity).
So i have entity "Phase"
class Phase (omitting doctrine annotations ans getter/setter)
{
private int $idPhase;
private ?DateTimeInterface $dtDue = null;
private int $nbNoticeDaysExpert = 7;
private int $nbNoticeDaysMember = 7;
}
I have 'parent' entity "Call" containing a collection of this first entity "Phase"
class Call (omitting doctrine annotations ans getter/setter)
{
private ?int $idCall = null;
private ?string $acronym = null;
private ?Call $previousCall = null;
private Collection $phases;
public function __construct()
{
$this->phases = new ArrayCollection();
}
}
I created basic Constraint and Validator classes and for my example, il attached it to each Property of my FormType
class PhaseUniqueByCallValidator extends ConstraintValidator
{
public function validate(mixed $value, Constraint $constraint): void
{
$this->context->buildViolation('paffffff')->addViolation();
return;
}
}
> I noticed that exactly the same happens if i use Symfony Validator (for exemple Count)
I have created the formType as usual.
class CallType extends AbstractType
{
$builder
->add('lbAcronyme', TextType::class, [
'required' => true,
'constraint' => [new PhaseUniqueByCall()],
])
->add('previousCall', EntityType::class, [
'class' => Call::class,
'constraint' => [new PhaseUniqueByCall()],
])
->add('phases', CollectionType::class, [
'entry_type' => Phase::class,
'constraint' => [new PhaseUniqueByCall()],
])
}
And So there is my problem, the Errors for the CollectionType is not rendered under its field in html because not attached to the formtype CollectionType
html rendered
When i dump in twig, i can see the error on the root
dump of FormType in twig
So may i have forget to specify something ? i searched several hours (maybe bad lol) but i did not find anybody having the same problem than me and i did not find either on issues of Symfony Git.
I even try to read code in vendor to find where the error was attached ti the formType but so many code that i did not find.
I have tried to deal with the function atPath
of the ConstraintViolationBuilder
class but without success and i did not find clear examples how to use it.
$this->context->buildViolation($constraint->messageFirst)
->atPath('phases')
->addViolation();
答案1
得分: 0
你应该在集合表单中关闭错误冒泡。
class CallType extends AbstractType
{
$builder
->add('lbAcronyme', TextType::class, [
'required' => true,
'constraint' => [new PhaseUniqueByCall()],
])
->add('previousCall', EntityType::class, [
'class' => Call::class,
'constraint' => [new PhaseUniqueByCall()],
])
->add('phases', CollectionType::class, [
'entry_type' => Phase::class,
'constraint' => [new PhaseUniqueByCall(), new Valid()],
'error_bubbling' => false
])
}
英文:
You should turn off error bubbling in collection form.
class CallType extends AbstractType
{
$builder
->add('lbAcronyme', TextType::class, [
'required' => true,
'constraint' => [new PhaseUniqueByCall()],
])
->add('previousCall', EntityType::class, [
'class' => Call::class,
'constraint' => [new PhaseUniqueByCall()],
])
->add('phases', CollectionType::class, [
'entry_type' => Phase::class,
'constraint' => [new PhaseUniqueByCall(), new Valid()],
'error_bubbling' => false
])
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论