symfony - 如何验证依赖于 Symfony 中另一个字段的字段
问题描述
需要找到一种方法,如何在 Symfony 中的自定义验证器中根据另一个值验证字段。在最后,我提供了我们如何在遗留应用程序中进行验证,但是我们如何从 Symfony 中的另一个字段获取值?
需要一些帮助,我有自定义验证器,这不是问题,但问题是 - 如何获取另一个字段的值。
private function validate_uds_message($size, $start, $stop) {
return $start <= $stop && $stop <= ($size * 1024) ? true : false;
}
验证器:
<?php
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
class UdsMessageValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
if (!$constraint instanceof UdsMessage) {
throw new UnexpectedTypeException($constraint, UdsMessage::class);
}
if (null === $value || '' === $value) {
return;
}
if (!is_int($value)) {
throw new UnexpectedValueException($value, 'int');
}
$startBit = /* ... */;
$stopBit = /* ... */;
if ($startBit <= $stopBit && $stopBit <= ($value * 1024)) {
return true;
} else {
$this->context->buildViolation($constraint->message)
->setParameter('{{ udsId }}', $value)
->addViolation();
}
}
}
解决方案
好的,我找到了如何使用它的解决方案,我将提供我的解决方案:
验证器:
<?php
namespace App\Validator\Constraints;
use App\Model\Odx2Parameter;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
class UdsMessageValidator extends ConstraintValidator
{
public function validate($parameter, Constraint $constraint)
{
if (!$constraint instanceof UdsMessage) {
throw new UnexpectedTypeException($constraint, UdsMessage::class);
}
if (!($parameter instanceof Odx2Parameter)) {
throw new UnexpectedValueException($parameter, Odx2Parameter::class);
}
$udsId = $parameter->getUdsId();
$startBit = $parameter->getStartBit();
$stopBit = $parameter->getStopBit();
if ($startBit <= $stopBit && $stopBit <= ($udsId * 1024)) {
return true;
} else {
$this->context->buildViolation($constraint->message)
->setParameter('{{ udsId }}', $udsId)
->atPath('udsId')
->addViolation();
$this->context->buildViolation($constraint->startBitMessage)
->setParameter('{{ startBit }}', $startBit)
->setParameter('{{ stopBit }}', $stopBit)
->atPath('startBit')
->addViolation();
$this->context->buildViolation($constraint->stopBitMessage)
->setParameter('{{ stopBit }}', $stopBit)
->setParameter('{{ stopBit }}', $stopBit)
->atPath('stopBit')
->addViolation();
}
}
}
约束:
<?php
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class UdsMessage extends Constraint
{
public $message = 'The UDS "{{ udsId }}" contains an illegal startBit or stopBit value.';
public $startBitMessage = '';
public $stopBitMessage = '';
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
}
表格类型:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'constraints' => [
New UdsMessage()
]
]);
}
推荐阅读
- python - Python 没有从 pip install 注册新模块
- angular - Ionic 5 - 离子内容中的异步
- java - 基于元素的Java拆分列表
- python - 如何生成随机值的 N 维数组?
- c# - Azure DevOps REST API
- javascript - 使用 PHP 如何获取 Javascript 对象值
- email - 图像跟踪不适用于 Google Analytics
- python - TypeError: fn got multiple values -- 如何不传递自我?
- swift - 如何更新视图状态以响应外部更改?
- r - 使用两种方法调用 ggplot() 时出现美学错误