2014-07-09 1 views
3

필드 수준에서 @Assert \ Expression (http://symfony.com/doc/2.4/reference/constraints/Expression.html)으로 속성의 유효성을 검사하려고합니다.Assert Expression 유효성 검사가 symfony 2.4의 속성 레벨에서 작동하지 않습니다.

그것은이 코드는 클래스 수준에서 작동

:

/** 
* Foo 
* 
* @ORM\Table(name="foo") 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity("slug") 
* @Assert\Expression(
*  "this.getPriceFor2PaxStandard() != null or (this.getPriceFor2PaxStandard() == null and !this.isPriceForAccLevelRequired('standard'))", 
*  message="The price for 2 pax standard is required", 
*  groups={"agency_tripEdit_finalsave"} 
*) 
* 
*/ 
class Foo implements ISpellcheckerLocaleProvider, ProcessStatusAware, DataTransformer 
{ 

하지만 속성 레벨에서 동일한 코드를 (잘되어야하는) 사용하는 경우 작동하지 않습니다 : 또한

/** 
    * @var decimal 
    * 
    * @ORM\Column(name="price_for_2_pax_standard", type="decimal", precision=16, scale=4, nullable=true) 
    * @Assert\Expression(
    *  "this.getPriceFor2PaxStandard() != null or (this.getPriceFor2PaxStandard() == null and !this.isPriceForAccLevelRequired('standard'))", 
    *  message="The price for 2 pax standard is required", 
    *  groups={"agency_tripEdit_finalsave"} 
    *) 
    */ 
    private $priceFor2PaxStandard; 

는 속성 레벨로 asseriont를 사용할 때 this.getPriceFor2PaxStandard() 대신 value을 사용하는 경우에도 작동하지 않습니다.

힌트 :-)

+0

아이디어가 있으십니까? :/ –

답변

3

이것은 심포니의 버그입니다. ExpressionValidator의 코드를 보면 값이 null인지 빈 문자열인지 검사하지 않습니다. 이것은 ExpressionValidator에서 무의미하지만 다른 제약 조건에 유용합니다. 방금 pull request을 제출하여 문제를 해결했습니다. 현재이 문제를 해결하는 가장 쉬운 방법은 콜백 유효성 검사기로 바꾸는 것입니다.

<?php 

namespace Symfony\Component\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\Exception\UnexpectedTypeException; 

class ExpressionValidator extends ConstraintValidator 
{ 
    public function validate($value, Constraint $constraint) 
    { 
     if (!$constraint instanceof Expression) { 
      throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\Expression'); 
     } 

     if (null === $value || '' === $value) { 
      return; 
     } 

     //... 
    } 

    //... 

} 
+0

감사합니다. Tom! 나는 여전히 표현 언어로 검증하지만 클래스 수준에서는 유효합니다. 그것은 내가 더 명확한 코드를 원한다는 것입니다. –

+0

PR이 병합 된 것처럼 보이고 2.6, 오른쪽 @Tom Corrigan 이후 문제가 해결 되었습니까? https://github.com/symfony/symfony/pull/11709 그러나 속성/값이 null 인 경우에도 내 표현식은 실행되지 않습니다./** @Assert \ Expression (this.getLoggiaHandrail() == '1' and value! = null) */$ loggiaHandRailMaterial; – webDEVILopers

관련 문제