2017-02-22 5 views
0

하나의 필드가 비어 있지 않으면 (유효성> 0) 유효성 검사를받는 필드의 길이는 특정 길이 (2 문자) 여야합니다. 이 상황에서 "Assert \ Expression"이 작동하는 것처럼 보이지만 속성 길이를 찾으려고하는 데 문제가 있습니다. Expression 내에서 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

하나의 수정을 제외하고는 ... 함수 정의를 가져야했습니다.'public function validateState (ExecutionContext $ context)'(제거 된 "Interface") 그게 맞는지 아닌지는 확실하지만 작동합니까? – snoop168