如何在Symfony 4中重写FOSUserBundle表单

如何在Symfony 4中重写FOSUserBundle表单,symfony,twig,fosuserbundle,symfony4,Symfony,Twig,Fosuserbundle,Symfony4,我想覆盖FOSUserBundle的RegistrationType表单,但在registration_content.html.twig模板中,我遇到了以下错误: 属性“firstname”或方法“firstname()”、“getfirstname()”/“isfirstname()”/“hasfirstname()”或“uu call()”都不存在,并且在类“Symfony\Component\Form\FormView”中都没有公共访问权限 这是我的注册类型表: class Re

我想覆盖FOSUserBundle的RegistrationType表单,但在registration_content.html.twig模板中,我遇到了以下错误:

属性“firstname”或方法“firstname()”、“getfirstname()”/“isfirstname()”/“hasfirstname()”或“uu call()”都不存在,并且在类“Symfony\Component\Form\FormView”中都没有公共访问权限

这是我的注册类型表:

    class RegistrationType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('firstname');
    }

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

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

}
fos_user.yaml:

fos_user:
registration:
    confirmation:
        enabled: true
    form:
        name: app_user_registration
db_driver: orm
user_class: App\Entity\User
firewall_name: main
from_email:
    address: foo@example.com
    sender_name: bar@example.com
用户实体:

class User extends BaseUser {
     //

     /**
     * @ORM\Column(type="string", length=50, nullable=true)
     */
    protected $firstname;
}
注册_content.html.twig:

    {{ form_start(form, {'method': 'post', 'action': path('fos_user_registration_register'), 'attr': {'class': 'fos_user_registration_register', 'id': 'form-sign-up'}}) }}
                <div class="form-group form-group--float form-group--centered">
                    {{ form_widget(form.firstname, {'attr': {'class': 'form-control'}}) }}
                    <label>{{ 'firstname'|trans }}</label>
                    <i class="form-group__bar"></i>
                </div>
{{ form_end(form) }}

我在学习官方教程时遇到了同样的问题

我无法解释为什么会出现这个问题,但它似乎与别名有关。无论如何,我无法让它在Symfony4和symfony3.4中工作

我使用了以下代码来规避此问题:

class RegistrationType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstname');
    }

    public function getParent() {
        return 'FOS\UserBundle\Form\Type\RegistrationFormType';
    }

}
然后将此行添加到fos_user.yaml:

fos_user:
    registration:
        form:
            type: App\Form\Type\RegistrationType
我希望这会有所帮助,直到有人找到一种方法,使它如预期的那样工作

  • 在src目录中创建一个名为Form的文件夹
  • 创建名为RegistrationFormType.php的文件并添加以下内容:

    名称空间App\Form

    使用Symfony\Component\Form\AbstractType

    使用Symfony\Component\Form\FormBuilderInterface

    使用FOS\UserBundle\Form\Type\RegistrationFormType作为BaseRegistrationFormType

    类注册FormType扩展了AbstractType

    {

  •         $builder
    
                ->add('first');
    
            $builder
                ->add('last');
    
        }
    
        public function getParent()
        {
            return BaseRegistrationFormType::class;
        }
    }
    
    公共函数buildForm(FormBuilderInterface$builder、array$options) {

            $builder
    
                ->add('first');
    
            $builder
                ->add('last');
    
        }
    
        public function getParent()
        {
            return BaseRegistrationFormType::class;
        }
    }
    
    以上假设您已向用户实体添加了两个新字段,并且已运行条令迁移以添加新字段。 提示:将字段设置为可空,这样您就不会使用FOS命令行工具

  • 将以下内容添加到config/packages中的fos_users.yaml文件中
  • 注册:

    form:
    
        type: App\Form\RegistrationFormType
    
    class: App\Form\RegistrationFormType
    
  • 将以下内容添加到services.yaml:

    app.form.registration:

    form:
    
        type: App\Form\RegistrationFormType
    
    class: App\Form\RegistrationFormType
    
  • 刷新表单,新字段将出现在表单中。

    工作示例 Symfony 4.2.3 | friendsofsymfony/用户包v2.1.2

    使用我们自己的类覆盖FOSUserBundle注册表单,并删除“username”字段,以作为示例

    从symfony根目录:

  • mkdir./src/Form/Type
  • cp./vendor/friendsofsymfony/user bundle/Form/Type/RegistrationFormType.php
  • 编辑
    /config/packages/fos\u user.yaml
  • 编辑
    /src/Form/Type/RegistrationFormType.php
    • 这些信息大部分都是从中获得的
    • 我没有研究
      getParent
      方法,但它似乎继承了原始的
      RegistrationFormType.php
      ,只是添加了我们在
      buildForm
      方法中所做的更改

      • 就我而言,我做了与罗伯特·塞勒相同的事情,但编辑了以下内容:

        public function getBlockPrefix()
        {
            return 'app_user_registration';
        }
        

        这对我来说很好!

        不确定您在问题中加入了多少
        User
        类,但是您是否为其他属性添加了getter和setter?由于
        $firstname
        受到保护,您需要有
        getFirstname
        setFirstname
        方法。@dlondro是的,我已经添加了sett呃methodsCache被清除了?你知道…什么都没有,即使有缓存:清除
        public function getBlockPrefix()
        {
            return 'app_user_registration';
        }