2013-11-14 1 views
1

어설 션 콜백 메서드 "processSignup"이있는 엔티티 계정이 있습니다. 로그인 제약 조건과 암호 제약 조건이 성공한 경우에만 "processSignup"을 호출하고 싶습니다. 내 processSignup 메소드에서 이것을 어떻게 확인할 수 있습니까?모든 제약 조건이 충족되는 경우에만 Assert Callback 메서드를 호출하는 방법?

<?php 
namespace MyProject\Bundle\FrontBundle\Entity; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Validator\ExecutionContext; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* @Assert\Callback(methods={"processSignup"}) 
*/ 
class Account 
{ 

    /** 
    * @Assert\NotBlank() 
    * @Assert\Type(type="string") 
    * @Assert\Length(min = 6, max = 16) 
    */ 
    protected $login; 

    /** 
    * @Assert\NotBlank() 
    * @Assert\Type(type="string") 
    * @Assert\Length(min = 8, max = 12) 
    */ 
    protected $password; 

    /** 
    * @param ExecutionContext $context 
    */ 
    public function processSignup(ExecutionContext $context) 
    { 
     // if login and password constraints success, do something 
    } 

    public function getLogin() 
    { 
     return $this->login; 
    } 

    public function setLogin($login) 
    { 
     $this->login = $login; 
    } 

    public function getPassword() 
    { 
     return $this->password; 
    } 

    public function setPassword($password) 
    { 
     $this->password = $password; 
    } 
} 
+0

'$ context-> getViolations()'를 사용해보십시오. 그것은 지금까지 모든 위반을 반환합니다. –

+0

시도했지만 제약 조건이 충족되지 않으면 빈 배열을 반환합니다. – user777897

+0

당신 말이 맞아요. 제약 조건이 성공했는지 아닌지를 확인하는 유일한 방법이라고 생각합니다. 사용자 이름과 암호 제약 조건을 트리거하고 배열이 비어 있는지 확인하십시오. 그냥 var_dump의 Xdebug로 이것을 할 수 있고 죽을 수 있습니다 :) –

답변

1

같은 경우에는 내가 사용한 적이 검증 그룹 :

/** @Assert\Callback(methods={"processSignup"}, groups={"LastValidation"}) */ 
class Account { 
    /** 
    * @Assert\NotBlank() 
    * @Assert\Type(type="string") 
    * @Assert\Length(min = 6, max = 16) 
    */ 
    protected $login; 
.... 
} 

및 FormType의 :

class AccountType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     .... 
    } 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    parent::setDefaultOptions($resolver); 
    $resolver->setDefaults(
      [ 
      .... 
      'validation_groups' => function (FormInterface $form) 
        { 
         return ['Account', 'LastValidation']; 
         // The first element's value must be the same as data-class name 
        } 
      ] 
    ); 

} 

그리고 processSignup 방법에서 확인할 수 있습니다

if(0 !== $context->getViolations()->count()) 
    { 
     return; 
    } 
관련 문제