Symfony2 и его formbuilder

#php #symfony #doctrine-orm

#php #symfony #доктрина-orm

Вопрос:

Итак, я знаю, что это только бета-версия прямо сейчас, но мы приняли решение продолжить с этим вместо 1.

Итак, у меня есть этот код

  $this->em = $this->get('doctrine.orm.entity_manager');
 $user = $this->em->find('BlahBlahBundle:User', $id);
 $dql = "SELECT r FROM BlahBlahBundleEntityRole r";
 if($user->getRole()->getRoleId() != '4')
       $dql .= " WHERE r.roleId != '4'";
 $rs = $this->em->createQuery($dql)->getResult();
 $roles = array();
 foreach($rs as $item)
       $roles[$item->getRoleId()] = $item->getName();

 $userRole = $user->getRole()->getRoleId();

 $radio = array('0' => 'No', '1' => 'yes');
 $form = $this->buildForm('User', $user)
              ->add('ScreenName')
              ->add('Email')
              ->add('Password','password', array('required' => false))
              ->add('Enabled', 'choice', array('choices' => $radio))
              ->add('AllowedOutside', 'choice', array('choices' => $radio))
              ->add('Role', 'choice', array( 'choices' => $roles, 'preferred_choices' => array($userRole)));
 $form = $form->getForm();
  

И он всегда умирает, когда я пытаюсь getForm() Когда я удаляю ‘Role’, он работает.

В нашей структуре базы данных Роли — это другая сущность, чем пользователи, но они ссылаются на них через внешний ключ

ошибка, которую я выдаю при попытке вызова getForm() , заключается в следующем

 Notice: Object of class ProxiesBlahBlahBundleEntityRoleProxy could not be converted to int in /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Util/FormUtil.php on line 18

Call Stack:
    0.0010     638064   1. {main}() /mnt/www/reportings/web/app_dev.php:0
    0.0374    1859640   2. SymfonyComponentHttpKernelKernel->handle() /mnt/www/reportings/web/app_dev.php:13
    0.0476    2073904   3. SymfonyBundleFrameworkBundleHttpKernel->handle() /mnt/www/reportings/app/bootstrap.php.cache:613
    0.0477    2074912   4. SymfonyComponentHttpKernelHttpKernel->handle() /mnt/www/reportings/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/HttpKernel.php:35
    0.0478    2074912   5. SymfonyComponentHttpKernelHttpKernel->handleRaw() /mnt/www/reportings/app/bootstrap.php.cache:420
    0.1955    3938880   6. call_user_func_array() /mnt/www/reportings/app/bootstrap.php.cache:442
    0.1955    3939368   7. BlahBlahBundleControllerUserController->editAction() /mnt/www/reportings/app/bootstrap.php.cache:442
    0.2696    5721072   8. SymfonyComponentFormFormBuilder->getForm() /mnt/www/reportings/src/Blah/BlahBundle/Controller/UserController.php:51
    0.3463    6520408   9. SymfonyComponentFormForm->setData() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/FormBuilder.php:454
    0.3465    6521136  10. SymfonyComponentFormExtensionCoreDataMapperPropertyPathMapper->mapDataToForms() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Form.php:378
    0.3523    6543648  11. SymfonyComponentFormExtensionCoreDataMapperPropertyPathMapper->mapDataToForm() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php:47
    0.3529    6543648  12. SymfonyComponentFormForm->setData() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php:56
    0.3531    6544512  13. SymfonyComponentFormForm->normToClient() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Form.php:369
    0.3531    6544512  14. SymfonyComponentFormExtensionCoreDataTransformerScalarToChoiceTransformer->transform() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Form.php:898
    0.3531    6544512  15. SymfonyComponentFormUtilFormUtil::toArrayKey() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataTransformer/ScalarToChoiceTransformer.php:21


Catchable fatal error: Object of class ProxiesBlahBlahBundleEntityRoleProxy could not be converted to string in /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Util/FormUtil.php on line 18

Call Stack:
    0.0010     638064   1. {main}() /mnt/www/reportings/web/app_dev.php:0
    0.0374    1859640   2. SymfonyComponentHttpKernelKernel->handle() /mnt/www/reportings/web/app_dev.php:13
    0.0476    2073904   3. SymfonyBundleFrameworkBundleHttpKernel->handle() /mnt/www/reportings/app/bootstrap.php.cache:613
    0.0477    2074912   4. SymfonyComponentHttpKernelHttpKernel->handle() /mnt/www/reportings/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/HttpKernel.php:35
    0.0478    2074912   5. SymfonyComponentHttpKernelHttpKernel->handleRaw() /mnt/www/reportings/app/bootstrap.php.cache:420
    0.1955    3938880   6. call_user_func_array() /mnt/www/reportings/app/bootstrap.php.cache:442
    0.1955    3939368   7. BlahBlahBundleControllerUserController->editAction() /mnt/www/reportings/app/bootstrap.php.cache:442
    0.2696    5721072   8. SymfonyComponentFormFormBuilder->getForm() /mnt/www/reportings/src/Blah/BlahBundle/Controller/UserController.php:51
    0.3463    6520408   9. SymfonyComponentFormForm->setData() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/FormBuilder.php:454
    0.3465    6521136  10. SymfonyComponentFormExtensionCoreDataMapperPropertyPathMapper->mapDataToForms() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Form.php:378
    0.3523    6543648  11. SymfonyComponentFormExtensionCoreDataMapperPropertyPathMapper->mapDataToForm() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php:47
    0.3529    6543648  12. SymfonyComponentFormForm->setData() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php:56
    0.3531    6544512  13. SymfonyComponentFormForm->normToClient() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Form.php:369
    0.3531    6544512  14. SymfonyComponentFormExtensionCoreDataTransformerScalarToChoiceTransformer->transform() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Form.php:898
    0.3531    6544512  15. SymfonyComponentFormUtilFormUtil::toArrayKey() /mnt/www/reportings/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataTransformer/ScalarToChoiceTransformer.php:21
  

у кого-нибудь есть идеи, как я могу это исправить?

Ответ №1:

Проблема в том, что когда компонент symfony form пытается получить текущее значение роли (выполнив $user->getRole() ), он получает прокси-объект doctrine вместо целого числа. Чтобы сообщить ему, что он понимает объект Role, вам нужно создать новый тип формы.

Вот пример в руководстве, как использовать их вместе с пользовательской формой, используя встроенные формы. (Продукт == Пользователь, Категория == Роль).

Комментарии:

1. В итоге я использовал entity type, потому что добавлять значения было немного проще, но это тоже работает