Как переопределить форму FOSUserBundle в Symfony 4

Я хочу переопределить форму RegistrationType FOSUserBundle, но в шаблоне 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';
    }

}

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: [email protected]
    sender_name: [email protected]

Объект пользователя:

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 }

person Mintendo    schedule 15.02.2018    source источник
comment
Не уверен, какую часть класса User вы вырезали, чтобы включить его в вопрос, но добавили ли вы геттер и сеттер для дополнительных свойств? Поскольку $firstname защищен, вам необходимо иметь методы getFirstname и setFirstname.   -  person dlondero    schedule 16.02.2018
comment
@dlondero Да, я уже добавил методы установки   -  person Mintendo    schedule 16.02.2018
comment
Кэш очистили? Тебе известно...   -  person dlondero    schedule 16.02.2018
comment
Ничего, даже с кешем:очистить   -  person Mintendo    schedule 16.02.2018


Ответы (4)


Рабочий пример

Symfony 4.2.3 | друзья symfony/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
  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.
person Chris    schedule 13.02.2019

Я столкнулся с той же проблемой, следуя официальному руководству 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

Я надеюсь, что это поможет, пока кто-нибудь не найдет способ заставить его работать так, как ожидалось.

person Gabriel Deschamps    schedule 27.03.2018

  1. Создайте папку с именем Form в вашем каталоге src.
  2. Создайте файл с именем RegistrationFormType.php и добавьте следующее содержимое:

    пространство имен Приложение\Форма;

    используйте 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;
    }
}

Вышеприведенное предполагает, что вы добавили два новых поля в свою сущность User и выполнили миграцию Doctrine для добавления новых полей. Совет: установите поля как обнуляемые, чтобы не использовать инструменты командной строки FOS.

  1. Добавьте следующее в файл fos_users.yaml в config/packages.

Регистрация:

form:

    type: App\Form\RegistrationFormType
  1. Добавьте в services.yaml следующее:

    app.form.registration:

    class: App\Form\RegistrationFormType
    

Обновите форму, и новые поля появятся в форме.

person Robert Saylor    schedule 09.08.2018

В моем случае я сделал то же самое, что и Роберт Сэйлор, но отредактировал это:

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

Это сработало хорошо для меня!

person CHEK    schedule 30.10.2020