2017-10-31 12 views
2

mySQL에서 ENUM 필드를 시뮬레이트하는 유효성 검사를 위해 수명주기 콜백을 갖도록 내 Entity를 설정했습니다.symfony 유효성 검사 콜백 - 오류 발생시 속성 이름을 얻는 방법?

오류가 발생하면 속성 이름을 제공하지 않아서 Assert에서 오는 오류의 형식과 일치하지 않는다는 점만 제외하면 잘 작동합니다.

UsedBundle \ AdController

이 : 나머지는 어설에 의해 생성 된 문제의 속성을 포함하는 동안 첫 번째 오류 아래의 예에서

는 콜백에서오고있다 및 재산에 대한 정보가 없습니다
$errors = $this->form_errors->getErrorMessages($form); 
     \Doctrine\Common\Util\Debug::dump($errors); 

array (3) {[0] => string (14) "잘못된 문!" [ "powerHp"] => array (1) {[0] => string (32) "이 값은 50 이상이어야합니다." } [ "price"] => array (1) {[0] => string (34) "이 값은 1000 이상이어야합니다." }}

메시지로 인해 오류의 출처를 알 수 있지만 사용자에게 출력하기 위해 오류 변수를 생성하는 기능을 중지시킵니다.

다음과 같다 설정 : 귀하의 경우

UsedBundle \ 엔티티 \ 광고

namespace UsedBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Gedmo\Mapping\Annotation as Gedmo; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\Context\ExecutionContextInterface; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
/** 
* @ORM\Entity(repositoryClass="UsedBundle\Repository\AdRepository") 
* @ORM\HasLifecycleCallbacks 
* @ORM\Table(name="ads") 
*/ 
class Ad 
{ 

/** 
* @var integer 
* 
* @ORM\Id 
* @ORM\Column(type="smallint",length=4,unique=true,options={"unsigned":true}) 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

...... 

public static $valid_doors = array(
    '2' => '2', 
    '3' => '3', 
    '4' => '4', 
    '5' => '5', 
); 

/** 
* @Assert\Callback 
*/ 
public function validate(ExecutionContextInterface $context, $payload) 
{ 
    if (!in_array($this->getdoors(), self::$valid_doors)) { 
     $context->buildViolation('Invalid doors!') 
      ->atPath('doors') 
      ->addViolation(); 
    } 
} 
} 

답변

0

(물론 당신의 심포니 버전 2.4 후 오래되지 않은 경우), 내가 사용하는 것이 좋습니다 수 있습니다 정적 유효성 검사 기능. 정적 함수를 사용할 때 $ 객체를 전달해야합니다!

/** 
* @static validate 
* 
* @param $object 
* @param ExecutionContextInterface $context 
*/ 
public static function validate($object, ExecutionContextInterface $context) 
{ 
    if (!in_array($object->getdoors(), self::$valid_doors)) { 
     $context->buildViolation('Invalid doors!') 
      ->atPath('doors') 
      ->addViolation(); 
    } 
} 

- 알 수 있듯이 /** @Assert\Callback */ 주석이 없습니다. 게다가 클래스 주석을 쓸 필요가 없습니다 @ORM\HasLifecycleCallbacks. 도움이 되었기를 바랍니다.

Also - this is a link to official Symfony documentation

+0

감사합니다. @staskrak. 이 일을 제대로 처리하지 못했습니다. $ object 매개 변수를 전달하는 방법은 잘 모르겠습니다. 그럴 수도 있습니다. 나는 3.2 버전을 사용하고 있습니다. 나는 링크 된 문서를 알고 있었지만 속성 이름의 문제는 해결하지 못했습니다. – BernardA

+0

@BernardA -> atPath ('doors') -이 속성은 오류와 관련이 있습니다. -> 폼을 삽입 한 경우 Assert \ Valid()를 사용해야합니다. 주석에 – staskrak