2012-07-24 2 views
1

ZF2 Rest Service에서 Doctrine 2 엔티티의 유효성을 검사하는 가장 좋은 방법을 고민하고 있습니다. 처음에는 Zend \ InputFilter \ InputFilter와 첨부 된 유효성 검사기를 확장 클래스 내에서 필터로 확장하여 유효성 검사를 구현했습니다. 내 유효성 검사가 엔티티 클래스와 완전히 분리되어 있기 때문에 이것이 최선의 방법이라고 확신하지 못합니다.ZF2 Rest Service/Doctrine Validation

Matthew의 기사 http://mwop.net/blog/2012-07-02-zf2-beta5-forms.html에 설명 된 주석을 사용하여 유효성 검사를 구현하는 방법에 대해 생각했지만 엔터티를 인스턴스화 할 때 종종이 접근 방식과 관련하여 내 의견이 일치하지 않습니다.

또한 내 엔터티에는 엔터티의 상태에 따라 다른 유효성 검사 규칙이 적용되는 경우가 많습니다. 예를 들어 BlogPost 엔티티가 있고 "초안"상태 인 경우 필드의 하위 집합 만 필요할 수 있습니다. '게시 됨'상태 인 경우 모든 입력란을 요구할 수 있습니다.

여기에서 취할 수있는 최선의 방법에 대한 아이디어가 있습니까? 이것은 REST 구현이므로 Zend \ Form에서 제공하는 비주얼은 필요하지 않습니다. \ Zend \ InputFilter \ InputFilter 확장 방법을 계속해야합니까? 아니면 내가 주석의 방향으로 가야합니까?

답변

0

주석은 훌륭하고 Doctrine EntityManger에서 반환 한 스키마 속성을 기반으로 양식 요소 비헤이비어를 정의 할 수 있도록 코드 생성에 주석을 사용하고 있습니다. 어노테이션이 엔티티 정의를 한 곳에서 더 많이 관리하고 관리하기 쉽도록 해 주었으면 좋았습니다. 지금까지는 사실이었습니다.

즉, 주석에 의해 할당 된 속성을 하위 클래스의 다른 주석으로 재정의 할 수 없다는 점에서 다소 유연하지 않은 주석을 발견했습니다.

런타임시 주석으로 설정된 속성을 쉽게 재정의 할 수 있지만 더 많은 주석으로는 수행 할 수 없습니다. (분명히 말할 수 있습니다.)

그래서 현재 컨트롤러 동작에서 재정의를하고 있습니다.

예 :

$builder = new AnnotationBuilder(); 
    $form = $builder->createForm($myEntity); 

    // customize the the InputFilter for myElement 
    $form->getInputFilter()->get('myElement')->setAllowEmpty(FALSE); 
    $form->getInputFilter()->get('myElement')->setRequired(TRUE); 
    $form->getInputFilter()->get('myElement')->getValidatorChain()->addValidator(new \Zend\Validator\NotEmpty('all')); 

    // carry on with the form as normal 
    $form->setData($this->getRequest()->getQuery()); 

나는 단지 지정 유효성 검사 규칙을 적용하고, 이러한도 조건 아마 시간이 더 이상 복잡 얻을 것으로 예상 할 필요가 시작했듯이, 나는 이동할 수 있습니다 기대 폼 빌더를 컨트롤러에서 모델로 옮깁니다. 그 이유는 조건부 유효성 검사 규칙을 정의하기 시작하면 논리가 속한 모델에 해당 논리가 있습니다. 이렇게하면 모든 폼 어셈블리가 블랙 박스 메서드로 바뀌므로 컨트롤러 동작도 정리됩니다.

예 :

$form = $myEntityModel->buildForm($myEntity); 

    // carry on with the form as normal 
    $form->setData($this->getRequest()->getQuery()); 

그래서 나는 당신이 당신의 기본 입력 규칙을 정의 주석을 사용하는지 여부에 중요한 생각하지 않습니다. 처음에 정의하는 방법에 관계없이 비즈니스 논리에 따라 수정하려고합니다.

폼 어셈블리를 모델 클래스로 옮겨서 유효성 검사 규칙을 엔티티와 완전히 구분하는 목표를 달성하는 것이 도움이 될 것 같아서 나에게 들립니다. 비즈니스 논리가 컨트롤러 나 엔터티가 아닌 모델에 있어야한다는 귀하의 본능이 옳다고 믿습니다.