2017-02-22 104 views
0

尝试验证一个字段是否为空(长度> 0),则验证字段的长度必须为特定长度(2个字符)。这看起来像一个“断言\表达式”可能在这种情况下工作,但我无法找到属性的长度。看起来你不能在表达式中调用php函数。 expression documentation提到的功能,但也许我不明白它......我需要注册我自己的功能,只需返回strlen()。如果是的话,你如何注册自己的功能?有人可以解释,如果有一种方法可以做到这一点,也许还有比使用,我俯瞰表达一个更好的办法...依赖于另一个属性的Symfony验证

/** 
* @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

+0

http://symfony.com/doc/current/reference/constraints/Length.html – Cerad

+0

所以,你想允许该字段为空,或者如果它不是空的,它必须有2个字符长度,对吗? – jkrnak

+0

是的,但它依赖于其他属性“PLATE”...所以如果PLATE为空STATE也可以为空,但如果PLATE有任何东西(长度> 0),那么STATE的长度必须为2 – snoop168

回答

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

工作除了一个修改...必须有函数定义读:'公共函数validateState(ExecutionContext $上下文)'(删除“接口”)不知道如果这是正确的或不是,但它的工作原理 – snoop168