Я пытаюсь добавить поля в свою регистрационную форму с помощью FosUserBundle.Регистрация с новыми полями
Добавление нормальных полей в Класс_пользователей как «имя», «возраст» например легко сделать:
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// add your custom field
$builder
->add('name')
;
}
public function getParent()
{
return 'fos_user_registration';
}
public function getName()
{
return 'acme_user_registration';
}
}
Это все работает и новые поля записываются в моей таблице базы данных.
Но как добавить новый тип FormType в тип регистрации Fos Bundle, например: Пользователь может иметь адрес, который связан с OneToMany.
Я попробовал его с нижеследующим, сначала создать класс адресов и давая ему одному пользователю:
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="addresses")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
, а затем добавлять адреса к классу пользователя:
/**
* @ORM\OneToMany(targetEntity="Address", mappedBy="user")
*/
protected $addresses;
public function __construct()
{
parent::__construct();
// your own logic
$this->addresses= new ArrayCollection();
}
Добавление AddressType :
class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('state', 'text')
->add('city','text')
->add('zipcode', 'text')
->add('street', 'text');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\Address',
));
}
public function getName()
{
return 'address';
}
}
для регистрацииFormType работает, и поля отображаются d в браузере:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// add your custom field
$builder
->add('name')
->add('addresses', new AddressType())
;
}
Но когда я пытаюсь отправить форму с новыми данными, я не знаю, как сказать Symfony, что адрес введенный должен быть связан с пользователем. Im всегда получает ошибку:
«Ожидается, что данные вида формы будут экземпляром класса Acme \ UserBundle \ Entity \ Address, но являются экземпляром класса Doctrine \ Common \ Collections \ ArrayCollection. Вы можете избежать этого ошибка, установив опцию «data_class» в значение null или добавив трансформатор вида, который преобразует экземпляр класса Doctrine \ Common \ Collections \ ArrayCollection в экземпляр Acme \ UserBundle \ Entity \ Address. "
Что я здесь делаю неправильно?
С уважением.
Хорошо, так что даже если я просто добавляю один адрес во время регистрации пользователю, так как есть отношение OneToMany, мне нужно использовать тип поля коллекции? И если im использует тип коллекции, тогда адрес будет автоматически сопоставлен с пользователем, поэтому в mysql будет запись в «адресе», относящемся к новому пользователю? С уважением –
Я думал, что один пользователь может иметь много адресов и один адрес может быть сопоставлен одному пользователю. (OneToMany) Но то, что вы говорите, также звучит right .. (ManyToOne), так будет ли это отношение ManyToMany? Я посмотрю на тип Entity, спасибо большое! –
Или это будет даже отношение OneToOne, когда я просто позволю пользователю ввести один адрес во время процесса регистрации и «необязательный» адрес? i Я бы сказал, что User (1) - Address (*) является правильным способом. –