2016-07-13 6 views
0

Я хочу проверить объект пользователя с пользовательским ограничением & валидатор. До сих пор он работает, когда запускается форма рабочего процесса, но если я запустить его вручную, я освобождаю одно отношение я настройки перед вызовом проверки:Symfony вручную проверяет сущность с отношением

UserController:

$user = new User(); 
$user->setRoles($roles); 
$user->setSite($site); 
... 

$violations = $this->container->get('validator')->validate($user); 

объект пользователя с отношением сайта:

/** 
    * @var Site the site linked to the entity 
    * @ORM\ManyToOne(targetEntity="LCH\MultisiteBundle\Entity\Site", cascade={"all"}) 
    * @ORM\JoinColumn(name="site_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $site; 

Validator:

public function validate($user, Constraint $constraint) 
    { 
     $email = $user->getEmail(); 

     // $site var is null while other "direct fields are filled 
     $site = $user->getSite(); 
     $roles = $user->getRoles(); 
     $username = $user->getUsername(); 

Как я могу вручную validat e этот объект использует предыдущее заданное отношение?

+0

Как вы получаете $ site из репозитория? – Edu

+0

Да, с помощью встроенного метода find ($ id), с $ id, предоставленным типом в форме. Вы думаете о проблеме с областью EntityManager? – nbonniot

+0

Вы можете попробовать сохранить свой пользователь перед проверкой – Edu

ответ

0

. Моя проблема возникла из структуры проверки формы Symfony2. : поскольку $ form-> handleRequest ($ request) действительно проверяет форму, запускаются все подключенные валидаторы (группы, пользовательские ограничения и обратные вызовы).

Мой $ сайт был нулевым, так как валидатор был уволен задолго до того, я настроил свой $ user-> атрибут сайта ...

// sumbit in this method trigger validation too early in my needs 
$form->handleRequest($request); 
$em = $this->getDoctrine()->getManager(); 
if ($form->isSubmitted() && $form->isValid() && !$isAjax) { 
    // custom processes to decide what to create 
    ... 
    // Here is the user creation 
    $user->setRoles($roles); 
    $user->setSite($site); 
    ... 
    // And the check 
    $violations = $this->container->get('validator')->validate($user); 
} 

Решение здесь соврал в disabling validation groups в основном типа. Таким образом, $ user полностью передается валидатору.

public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'validation_groups' => false, 
     )); 
    } 

Основным недостатком этой системы является то, что я должен вручную запустить проверку для этого самого типа во всех взаимодействиях, но этот тип достаточно сложен, чтобы иметь смысл здесь.