使用更多表单字段扩展奏鸣曲用户包,获取无法加载类型“Application\Sonata\UserBundle\Form\RegistrationType”

Posted

技术标签:

【中文标题】使用更多表单字段扩展奏鸣曲用户包,获取无法加载类型“Application\\Sonata\\UserBundle\\Form\\RegistrationType”【英文标题】:extending sonata user bundle with more form fields, get Could not load type "Application\Sonata\UserBundle\Form\RegistrationType"使用更多表单字段扩展奏鸣曲用户包,获取无法加载类型“Application\Sonata\UserBundle\Form\RegistrationType” 【发布时间】:2019-12-19 10:03:15 【问题描述】:

我正在尝试扩展注册表以显示更多字段,但在尝试了多种变体之后,我认为要么存在错误,要么我在教程和帖子中看到的配置设置对于 symfony 2.7 驱动不正确我疯了,想也许等到我升级到 3.4 版,但目前升级并不顺利。

错误 -

Could not load type 
                  "Application\Sonata\UserBundle\Form\RegistrationType"

表格 -

namespace Application\Sonata\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class RegistrationType extends AbstractType

public function buildForm(FormBuilderInterface $builder, array 
$options)


    $builder->add('firstname')
        ->add('dateOfBirth');


public function getParent()

    return 'FOS\UserBundle\Form\Type\RegistrationFormType';


public function getBlockPrefix()

    return 'app_user_registration';


// For Symfony 2.x
public function getName()

    return $this->getBlockPrefix();

config_dev.yml

  fos_user:
      db_driver: orm 
      firewall_name: secured_area
      user_class: Application\Sonata\UserBundle\Entity\User
      registration:
          form:
             type: Application\Sonata\UserBundle\RegistrationType
      group:
         group_class: Application\Sonata\UserBundle\Entity\User

services.yml

        services:
          app.form.registration: 
          class: Application\Sonata\UserBundle\Form\RegistrationType
          arguments: [%fos_user.model.user.class%]
          tags:
          -  name: form.type, alias: app_user_registration 

如前所述,它是 symfony 2.7 和 Sonata user-bundle 3.2,任何帮助都将不胜感激

出错的代码部分是 config_dev.yml 中的这一行

    registration:
      form:
         type: Application\Sonata\UserBundle\RegistrationType

routing.yml

       fos_user_register:
       resource: 
       "@FOSUserBundle/Resources/config/routing/registration.xml"
       prefix: /register

    #  sonata_user_register:
    # resource: 

   # 

 @SonataUserBundle/Resources/config/routing/sonata_registration_1.xml"

#前缀:/register

完整配置

    fos_user:
             db_driver: orm # other valid values are 
             'mongodb', 'couchdb' and 'propel'
              firewall_name: secured_area
              registration:
              form:
              type: eventsBundle\Form\RegistrationType
              user_class: 
              Application\Sonata\UserBundle\Entity\User
              group:
              group_class: Application\Sonata\UserBundle\Entity\User
              #group_manager: sonata.user.orm.group_manager                    
              # If you're using doctrine orm (use 
              Sonata.user.mongodb.group_manager for mongodb)

              service:
              user_manager: sonata.user.orm.user_manager                      
              # If you're using doctrine orm (use 
              sonata.user.mongodb.user_manager for mongodb)

【问题讨论】:

symfony.com/doc/master/bundles/FOSUserBundle/… 关注此处的文档 奇怪的情况,我的问题可能看起来很基本,但是在项目中激活了 Sonata 捆绑包吗? @pietro 是的 Sonata 已经运行了几年,运行良好。使用 easyextends 是否有区别,但不要认为有区别 好吧,我以为是这样,但有时我们会错过一些简单的事情(我不止一次发生过这种情况)。我继续寻找你 你能告诉我们注册类型文件在哪里吗? 【参考方案1】:

如果你想让它变得简单,你必须覆盖正确的基本注册表单,来自FOS\UserBundle,比如Official FOSUSerBundle documentation:

namespace YourBundle\Form;

use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

use YourBundle\Entity\User;

class RegistrationType extends BaseType 

   public function __construct()
   
      parent::__construct(User::class);
     
   public function buildForm(FormBuilderInterface $builder, array $options)
   
      parent::buildForm($builder, $options);
      $builder->add('firstname')
              ->add('dateOfBirth');
   
   public function getParent()
   
       return 'FOS\UserBundle\Form\Type\RegistrationFormType';
       // Or for Symfony < 2.8
       // return 'fos_user_registration';
   
   public function getBlockPrefix()
   
       return 'app_user_registration';
   
   // For Symfony 2.x
   public function getName()
   
       return $this->getBlockPrefix();
   

然后您必须将表单类型配置为服务:

# app/config/services.yml
services:
    app.form.registration:
        class: YourBundle\Form\RegistrationType
        tags:
            -  name: form.type, alias: app_user_registration 

最后,你必须更新FOSUserBundle的配置:

# app/config/config.yml
fos_user:
    # ...
    registration:
        form:
            type: YourBundle\Form\RegistrationType
            # if you are using Symfony < 2.8 you should use the type name instead
            # type: app_user_registration

希望对您有所帮助...

【讨论】:

谢谢,我尝试了你的建议和同样的问题,但是当我尝试使用 fose 用户捆绑包进行注册时,我认为在路由中,而不是奏鸣曲。发生错误,如果我在路由中有两个选项,我没有,但我只是得到标准注册表,它完全忽略了“RegistrationType”,所以我只使用一个激活的路由或两者都激活?此刻—— 你清除缓存了吗?你能更新你的问题并粘贴 routing.yml 吗? 我已经在原始问题上添加了路由。是清除缓存 你能粘贴整个 config.yml 吗? 我已将 fos_user: 部分添加为 rest 太长而无法格式化。我确实尝试将 user_class: 更改为 eventsBundle 用户实体,然后它开始在 orm 中询问 userName。不确定是否仅仅为了扩展表单而需要覆盖?【参考方案2】:

对我来说,上面没有任何东西在 Symfony 2.7 中起作用。我升级到 Symfony 3.4,它现在可以工作了!!完全遵循标准指南https://symfony.com/doc/master/bundles/FOSUserBundle/overriding_forms.html 确实需要升级,可能自动装配功能有所帮助。

【讨论】:

【参考方案3】:

试试看:

config.yml

registration:
    form:
        type: eventsBundle\Form\RegistrationType

service.yml

app.form.registration:
    class: eventsBundle\Form\RegistrationType
    tags:
        -  name: form.type, alias: app_user_registration 

【讨论】:

该文件应命名为 services.yml 并且 services: 部分丢失

以上是关于使用更多表单字段扩展奏鸣曲用户包,获取无法加载类型“Application\Sonata\UserBundle\Form\RegistrationType”的主要内容,如果未能解决你的问题,请参考以下文章

在普通表单类上使用奏鸣曲字段类型

Symfony 形式的奏鸣曲字段类型

如何在奏鸣曲中获取字段类型的自定义值?

使用 Sonata 字段类型在 Controller 中创建表单

如何在奏鸣曲编辑表单中显示字段值?

多个嵌套集合字段和奏鸣曲类型集合