英文:
Symfony : adding standard constraint in a custom constraint
问题
I'm trying to add in a custom constraint defined as defined in the official documentation, a built-in constraint (for instance, Url).
So basically, I've added to my validator class, in the validation method:
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraint;
public function validate($value, Constraint $constraint): void
{
[...]
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url());
}
as it seems possible in this article.
Unfortunately, it is not working. The violation is not added to the other of the constraint. I have no choice to replace the code by something less concise as :
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraint;
public function validate($value, Constraint $constraint): void
{
[...]
$urlConstraint = new Url();
$violations = $this->context
->getValidator()
->validate($value, $urlConstraint);
if (count($violations) !== 0) {
$this->context
->buildViolation($urlConstraint->message)
->addViolation();
}
}
Is there any possibility to include the standard constraint to the custom one (without of course adding the constraint directly to the Entity class) ?
英文:
I'm trying to add in a custom constraint defined as defined in the official documentation, a built-in constraint (for instance, Url).
So basically, I've added to my validator class, in the validation method:
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraint;
public function validate($value, Constraint $constraint): void
{
[...]
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url());
}
as it seems possible in this article.
Unfortunately, it is not working. The violation is not added to the other of the constraint. I have no choice to replace the code by something less concise as :
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraint;
public function validate($value, Constraint $constraint): void
{
[...]
$urlConstraint = new Url();
$violations = $this->context
->getValidator()
->validate($value, $urlConstraint);
if (count($violations) !== 0) {
$this->context
->buildViolation($urlConstraint->message)
->addViolation();
}
Is there any possibility to include the standard constraint to the custom one (without of course adding the constraint directly to the Entity class) ?
答案1
得分: 1
在上面的示例中,我没有提到验证是放置在特定的验证组中的。
因此,标准约束未触发。必须将标准约束附加到默认组:
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url(), Constraint::DEFAULT_GROUP);
Constraint::DEFAULT_GROUP
等于 'Default'。
英文:
In the example above, I didn't mention that the validation was placed in a specific validation group.
Because of that, the standard constraint wasn't triggered. It was necessary to attach the standard constraint to the default group:
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url(), Constraint::DEFAULT_GROUP);
Constraint::DEFAULT_GROUP
is equals to 'Default'.
答案2
得分: 0
我无法复现这个问题(Symfony 6.2),所有违规都已添加。也许问题出在其他地方。比较的代码如下:
namespace App\Validator;
use Attribute;
use Symfony\Component\Validator\Constraint;
#[Attribute]
class MyConstraint extends Constraint
{
}
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\ConstraintValidator;
class MyConstraintValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$this->context
->buildViolation('Not valid.')
->addViolation();
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url());
}
}
namespace App\Request;
use App\Validator.MyConstraint;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Length;
class YourRequest
{
#[Email]
#[MyConstraint]
#[Length(exactly: 2)]
public string $value;
}
在这种情况下,显示了4个违规:Email,'Not valid.',Url,Length。
英文:
I can not reproduce the problem (Symfony 6.2), all violations are added. Perhaps the problem is something else. The code for compare:
namespace App\Validator;
use Attribute;
use Symfony\Component\Validator\Constraint;
#[Attribute]
class MyConstraint extends Constraint
{
}
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\ConstraintValidator;
class MyConstraintValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$this->context
->buildViolation('Not valid.')
->addViolation();
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url());
}
}
namespace App\Request;
use App\Validator\MyConstraint;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Length;
class YourRequest
{
#[Email]
#[MyConstraint]
#[Length(exactly: 2)]
public string $value;
}
In this case, 4 violations are displayed: Email, 'Not valid.', Url, Length.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论