如何在Symfony 4中覆盖FOSUserBundle表单

时间:2018-02-15 20:16:02

标签: symfony twig fosuserbundle symfony4

我想覆盖FOSUserBundle的RegistrationType形式,但是在registration_content.html.twig模板中我收到了这个错误:

  

属性"名字"也不是其中一种方法" firstname()"," getfirstname()" /" isfirstname()" /" hasfirstname()&# 34;或" __ call()"在课堂上存在并拥有公共访问权限#34; Symfony \ Component \ Form \ FormView"。

这是我的RegistrationType表格:

    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;
}

registration_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) }}

在我的配置服务中,我已经说过:

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

4 个答案:

答案 0 :(得分:2)

我在遵循官方教程https://symfony.com/doc/current/bundles/FOSUserBundle/overriding_forms.html

时遇到了同样的问题

我无法解释为什么我们遇到这个问题,但它似乎与别名有关。无论如何,我不能让它在Symfony4和Symfony 3.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

我希望这会有所帮助,直到有人找到一种方法让它按预期工作。

答案 1 :(得分:1)

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

    命名空间App \ Form;

    使用Symfony \ Component \ Form \ AbstractType;

    使用Symfony \ Component \ Form \ FormBuilderInterface;

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

    RegistrationFormType类扩展了AbstractType

    {

公共函数buildForm(FormBuilderInterface $ builder,数组$ options)         {

        $builder

            ->add('first');

        $builder
            ->add('last');

    }

    public function getParent()
    {
        return BaseRegistrationFormType::class;
    }
}

以上内容是假设您已向用户实体添加了两个新字段,并且已经运行了Doctrine迁移以添加新字段。 提示:请将字段设置为可为空,以便您不要使用FOS命令行工具。

  1. 将以下内容添加到config / packages中的fos_users.yaml文件中

注册:

form:

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

    app.form.registration:

    class: App\Form\RegistrationFormType
    

刷新您的表单,新字段将出现在表单中。

答案 2 :(得分:1)

工作示例

Symfony 4.2.3 | friendsofsymfony /用户捆绑包v2.1.2

使用我们自己的类覆盖FOSUserBundle注册表单,并出于示例的目的删除“用户名”字段。

从您的symfony根目录:

  1. mkdir ./src/Form/Type
  2. cp ./vendor/friendsofsymfony/user-bundle/Form/Type/RegistrationFormType.php
  3. 编辑./config/packages/fos_user.yaml
# fos_user.yaml
fos_user:

    #... other configurations...

    registration:
        form:
            type: App\Form\Type\RegistrationType
  1. 编辑./src/Form/Type/RegistrationFormType.php
// Our specific example. edit this as you please...
<?php

namespace App\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseRegistrationFormType;

class RegistrationFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->remove('username');
    }
    public function getParent() {
        return BaseRegistrationFormType::class;
    }
}

注意: 由于我们的示例仅删除单个字段,因此我们删除了未更改的代码,并添加了以下方法以使事情保持简单:

public function getParent() {
    return BaseRegistrationFormType::class;
}
  • 大多数信息是从@Gabriel Deschamps@Robert Saylor答案中获得的。
  • 我没有研究getParent方法,但是它似乎是从原始的RegistrationFormType.php继承而来的,只是添加了在buildForm方法中所做的更改。

答案 3 :(得分:0)

就我而言,我做过与罗伯特·塞勒(Robert Saylor)相同的设计,但对此进行了编辑:

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

对我来说很好!