Расширение регистрации 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';
}
}
Мои основные вопросы:
Может ли кто-нибудь увидеть ошибку в моем текущем коде?
В связи с расширением формы для хранения нескольких полей в нескольких таблицах. Какой шаг я должен предпринять? Должен ли я переписать логику контроллера и форма???
Любая помощь была бы очень признательна.
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';
}
}
Поэтому я думаю, что ваша проблема в этом файле. Можете ли вы сравнить файл и ваш файл, и, возможно, вы обнаружите ошибку.
Со мной было то, что у меня уже была служба.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 }