Symfony 验证依赖于另一个 属性
Symfony Validation dependent on another property
尝试验证一个字段是否为空(长度 > 0),然后被验证字段的长度必须是特定长度(2 个字符)。 "Assert\Expression" 似乎在这种情况下可能有效,但我在尝试查找属性的长度时遇到了问题。您似乎无法在表达式中调用 php 函数。 expression documentation 提到了功能,但也许我不明白它......我是否需要注册我自己的功能,只是 return 一个 strlen()
。如果是这样,您如何注册自己的功能?有人可以解释一下是否有办法做到这一点,或者有比使用我忽略的 Expression 更好的方法...
/**
* @var string
*
* @ORM\Column(name="plate", type="string", length=10)
*/
private $plate;
/**
* @var string
*
* @ORM\Column(name="state", type="string", length=2)
* @Assert\Expression(
* "strlen(this.getPlate()) == 0 or (strlen(this.getPlate()) > 0 and strlen(value) == 2)",
* message="Must be 2 characters"
* )
*/
private $state;
在上述情况下我得到一个错误The function "strlen" does not exist around position 1
看来您需要注册自己的函数。查看文档:https://symfony.com/doc/current/components/expression_language/extending.html#registering-functions
lowercase
上有例子,strlen
应该很相似。
编辑:
您还可以使用回调验证器。
/**
* @Assert\Callback()
*/
public function validateState(ExecutionContextInterface $context)
{
if (!empty($this->plate) && mb_strlen($this->state) !== 2) {
$context->buildViolation('State must be 2 characters long')
->atPath('state')
->addViolation();
}
}
但是如果你打算在多个地方使用这种验证,你可以编写并注册你自己的验证器。
尝试验证一个字段是否为空(长度 > 0),然后被验证字段的长度必须是特定长度(2 个字符)。 "Assert\Expression" 似乎在这种情况下可能有效,但我在尝试查找属性的长度时遇到了问题。您似乎无法在表达式中调用 php 函数。 expression documentation 提到了功能,但也许我不明白它......我是否需要注册我自己的功能,只是 return 一个 strlen()
。如果是这样,您如何注册自己的功能?有人可以解释一下是否有办法做到这一点,或者有比使用我忽略的 Expression 更好的方法...
/**
* @var string
*
* @ORM\Column(name="plate", type="string", length=10)
*/
private $plate;
/**
* @var string
*
* @ORM\Column(name="state", type="string", length=2)
* @Assert\Expression(
* "strlen(this.getPlate()) == 0 or (strlen(this.getPlate()) > 0 and strlen(value) == 2)",
* message="Must be 2 characters"
* )
*/
private $state;
在上述情况下我得到一个错误The function "strlen" does not exist around position 1
看来您需要注册自己的函数。查看文档:https://symfony.com/doc/current/components/expression_language/extending.html#registering-functions
lowercase
上有例子,strlen
应该很相似。
编辑:
您还可以使用回调验证器。
/**
* @Assert\Callback()
*/
public function validateState(ExecutionContextInterface $context)
{
if (!empty($this->plate) && mb_strlen($this->state) !== 2) {
$context->buildViolation('State must be 2 characters long')
->atPath('state')
->addViolation();
}
}
但是如果你打算在多个地方使用这种验证,你可以编写并注册你自己的验证器。