如何在 Symfony 4 中覆盖 FOSUserBundle 表单

Min*_*ndo 3 symfony twig fosuserbundle symfony4

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

属性“firstname”和方法“firstname()”、“getfirstname()”/“isfirstname()”/“hasfirstname()”或“__call()”都不存在并且在类“Symfony\”中具有公共访问权限组件\表单\表单视图”。

这是我的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';
    }

}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

用户实体:

class User extends BaseUser {
     //

     /**
     * @ORM\Column(type="string", length=50, nullable=true)
     */
    protected $firstname;
}
Run Code Online (Sandbox Code Playgroud)

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) }}
Run Code Online (Sandbox Code Playgroud)

在我的配置服务中,我已经把这个:

app.form.registration:
        class: App\Form\RegistrationType
        tags:
            - { name: form.type, alias: app_user_registration }
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 5

工作示例

Symfony 4.2.3 | Friendsofsymfony/user-bundle 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
Run Code Online (Sandbox Code Playgroud)
  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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public function getParent() {
    return BaseRegistrationFormType::class;
}
Run Code Online (Sandbox Code Playgroud)
  • 大部分信息来自@Gabriel Deschamps@Robert Saylor 的回答。
  • 我没有研究该getParent方法,但它似乎继承了原始方法RegistrationFormType.php,只需添加我们在buildForm方法中所做的更改。