Расширение регистрации FOSUserBundles для хранения разных полей в разных таблицах?


Я новичок в Symfony2 и FOSUserBundle. Я использую Symfony2 версии 2.4.1. Я хотел бы расширить FOSUserBundle несколькими способами. Я хочу добавить поля в регистрационную форму, некоторые поля я хотел бы добавить в таблицу пользователей, которая содержит имя пользователя и пароль, но я хотел бы добавить поля, которые добавляются в другую таблицу. (Я думаю, что мне нужно переписать RegisterController??)

В настоящее время я унаследовал FOSUserBundle в свой собственный UserBundle. Я пытался просто добавьте поля в текущую регистрационную форму, следуя документации, но я продолжаю возвращать эту ошибку.

Не удалось загрузить тип "acme_user_registration"

// src/Fixie/UserBundle/Entity/User.php

    <?php

namespace Fixie\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=255)
     *
     * @Assert\NotBlank(message="Please enter your name.", groups={"Registration", "Profile"})
     * @Assert\Length(
     *     min=3,
     *     max="255",
     *     minMessage="The name is too short.",
     *     maxMessage="The name is too long.",
     *     groups={"Registration", "Profile"}
     * )
     */
    protected $name;


    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

Затем я добавляю поле имени в конструктор форм

// src/Fixie/UserBundle/Form/Type/RegistrationFormType.php

 <?php

namespace Fixie\UserBundle\Form\Type;

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

class RegistrationFormType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        // add your custom field
        $builder->add('name');
    }

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

Затем я продолжаю объявлять тип пользовательской формы:

// src/Fixie/UserBundle/Ресурсы/конфигурация/сервисы.yml

services:
    acme_user.registration.form.type:
        class: Fixie\UserBundle\Form\Type\RegistrationFormType
        arguments: [%fos_user.model.user.class%]
        tags:
            - { name: form.type, alias: acme_user_registration }

Затем обновлена конфигурация:

 fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    user_class: Fixie\UserBundle\Entity\User
    registration:
        form:
           type: acme_user_registration

//AppKernel.php

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new Fixie\WelcomeBundle\WelcomeBundle(),
            new Fixie\UserBundle\UserBundle(),

            new FOS\UserBundle\FOSUserBundle(),
        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
        }

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}

// Fixie/UserBundle/UserBundle.php

<?php

namespace Fixie\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class UserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

Мои основные вопросы:

  1. Может ли кто-нибудь увидеть ошибку в моем текущем коде?

  2. В связи с расширением формы для хранения нескольких полей в нескольких таблицах. Какой шаг я должен предпринять? Должен ли я переписать логику контроллера и форма???

Любая помощь была бы очень признательна.

Author: bowseph, 2014-02-10

2 answers

Хорошо.

В appKerenl.php у вас есть

 new Fixie\UserBundle\UserBundle(),

Но в service.yml

class: Acme\UserBundle\Form\Type\RegistrationFormType

Может быть, это должно быть:

class: Fixie\UserBundle\Form\Type\RegistrationFormType

Если в результате команды app/console container:debug вы не видите acme_user.registration.form.type, это означает, что ваша служба не регистрируется и fos_user не может видеть вашу службу и не может найти ваш тип формы.

Мой магазин UserBundle в Webmil/Joint/UserBundle. В папке UserBundle у меня есть файл WebmilJointUserBundle.php

Мой файл:

<?php

namespace Webmil\Joint\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class WebmilJointUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

Поэтому я думаю, что ваша проблема в этом файле. Можете ли вы сравнить файл и ваш файл, и, возможно, вы обнаружите ошибку.

 1
Author: denys281, 2014-02-14 07:43:29

Со мной было то, что у меня уже была служба.yml в приложении/конфигурации, поэтому тот, что был в моем пакете, был проигнорирован. В конце концов я добавил реестр в этот файл

# app/config/services.yml
services:

    # [other already existing services]

    acme_user.registration.form.type:
        class: Acme\UserBundle\Form\Type\RegistrationFormType
        tags:
            - { name: form.type, alias: acme_user_registration }
 0
Author: Andreas, 2015-04-26 11:54:23