2015-07-27 3 views
0

Я использую FOSUserBundle и я пытаюсь настроить форму регистрации пользователя с возможностью is_admin. Я не понимаю, почему значение опции не передается из функции createForm() функции функции buildForm().Symfony2 Форма Вариант Разрешение

Ниже приведен соответствующий код в контроллере:

$has_admin_rights = $this->get('security.authorization_checker') 
->isGranted('ROLE_SUPER_ADMIN'); 
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */ 
$formFactory = $this->get('fos_user.registration.form.factory'); 
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */ 
$userManager = $this->get('fos_user.user_manager'); 
$user = $userManager->createUser(); 
... 
$form = $formFactory->createForm(
new RegistrationFormType(), $user, array('is_admin' => $has_admin_rights)); 

Ниже пользовательский класс формы, который должен, в теории, решить is_admin вариант. Однако похоже, что опция не передана должным образом.

class RegistrationFormType extends AbstractType 
{ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    if($options['is_admin'] === true) 
    { 
     $builder->add('uniqueRole', 'choice', array(
      'choices' => array('ROLE_ADMIN' => 'user.role.admin', 
       'ROLE_TEACHER' => 'user.role.teacher', 
       'ROLE_STUDENT' => 'user.role.student'), 
      'label' => 'form.label.role', 
      'expanded' => false, 
      'multiple' => false, 
      'mapped' => false 
      )); 
     $builder->remove('plainPassword')->add('plainPassword', 'hidden', array('data' => 'defaultPwd')); 
    } else { 
     // Default value is indeed set, 
     // and options[is_admin] always equals to false 
     if (array_key_exists("is_admin", $options)){ 
      echo 'Set!'; 
     } else { 
      echo 'Not Set!'; 
     } 
    } 
    $builder->add('save', 'submit', array('label' => 'actions.add')); 
} 

protected function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setRequired(array(
     'is_admin')); 
    $resolver->setDefaults(array(
     'is_admin' => false, 
     'data_class' => 'VMB\UserBundle\Entity\User', 
     'intention' => 'registration', 
    )); 
} 

// BC for SF < 2.7 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $this->configureOptions($resolver); 
} 

public function getParent() 
{ 
    return 'fos_user_registration'; 
} 

public function getName() 
{ 
    return 'vmb_user_registration'; 
} 
} 

Я также попытался передать параметр в конструктор такого образом

$form = $formFactory->createForm(new RegistrationFormType($has_admin_rights), $user);

однако Symfony2 AppCache инициализирует объект формы без надлежащего значения пар (который возвращается к определенным null умолчанию стоимость). Что я делаю неправильно?

+0

мне любопытно ... '$ formFactory' на самом деле, какой типа? Я не могу найти метод с именем 'createForm' в' FormFactory', 'FormFactoryBuilder' или' FormFactoryInterface'. –

ответ

0

Я думаю, что это просто вопрос вызова неправильного сервиса.

Вы получили экземпляр FormFactory через:

$formFactory = $this->get('fos_user.registration.form.factory'); 

, но это не Symfony-х FormFactory. В самом деле, если вы посмотрите на это источник here, вы увидите следующее:

public function createForm() 
{ 
    return $this->formFactory->createNamed($this->name, $this->type, null, array('validation_groups' => $this->validationGroups)); 
} 

В принципе, createForm не ожидает каких-либо аргументов вообще.

Таким образом, вместо этого, вы должны использовать Symfony собственной form.factory (source):

$has_admin_rights = $this->get('security.authorization_checker')->isGranted('ROLE_SUPER_ADMIN'); 

/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */ 
$formFactory = $this->get('form.factory'); 

/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */ 
$userManager = $this->get('fos_user.user_manager'); 

$user = $userManager->createUser(); 

$form = $formFactory 
    ->createBuilder(new RegistrationFormType(), $user, array('is_admin' => $has_admin_rights)) 
    ->getForm(); 

Надеется, что это помогает ...

Смежные вопросы