2013-02-19 2 views
8

Я пытаюсь расширить FOS UserBundle, чтобы позволить расширенным объектам профиля хранить дополнительную информацию в дополнение к основным полям UserBundle. Поскольку у меня есть несколько типов пользователей на сайте, я создал отдельные объекты для хранения информации профиля. У меня есть объекты, установленные следующим образом:Добавление объекта расширенного профиля в FOS UserBundle

class UserProfile 
{ 
    /** 
    * @var integer 
    */ 
    private $id; 

    /** 
    * @var integer 
    */ 
    private $userId; 

    /** 
    * @var string 
    */ 
    private $phone; 

    /** 
    * @var string 
    */ 
    private $language; 

    /** 
    * @var string 
    */ 
    private $company; 

    /** 
    * @var string 
    */ 
    private $salutation; 

    /** 
    * @var string 
    */ 
    private $fax; 

    /** 
    * @var string 
    */ 
    private $region; 

Моей конфигурация

type: entity 
table: user_profile 
fields: 
    id: 
     type: integer 
     id: true 
     generator: 
      strategy: AUTO 
    phone: 
     type: string 
     length: '15' 
    language: 
     type: string 
     length: '50' 
    company: 
     type: string 
     length: 255 
    salutation: 
     type: string 
     length: '5' 
    fax: 
     type: string 
     length: '15' 
    region: 
     type: string 
     length: 255 
oneToOne: 
    userId: 
     targetEntity: User 
     joinColumn: 
      name: user_id 
      referencedColumnName: id 
lifecycleCallbacks: { } 

У меня есть несколько других типов пользователей с более конкретной информацией, которая коренным образом отличается, поэтому мне нужны отдельные сущности, я, например, может иметь пользователя с 3 адресами, или идентификаторы сотрудников и т. д. Учитывая это, как мне реализовать регистрационную форму для создания информации о профиле пользователя, когда я создаю информацию UserBundle? Заранее спасибо!

ответ

10

Если вы используете MySQL и PHP для определения сущностей, то вы должны создать свой Entity следующим образом:

<?php 
// src/Acme/UserBundle/Entity/UserProfile.php 

namespace Acme\UserBundle\Entity; 

use FOS\UserBundle\Entity\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 

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

    /** 
    * @var string 
    */ 
    private $phone; 

    /** 
    * @var string 
    */ 
    private $language; 

    //.................... 
    //Add all your properties here 

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

Второго шаг заключается в создании вы формируете типа с просьбой поля, которые вы хотите:

// src/Acme/UserBundle/Form/Type/RegistrationFormType.php 
<?php 

namespace Acme\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('phone'); 
     $builder->add('language'); 

     //............... 
     //Add all your properties here with $builder->add('property name') 
    } 

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

Теперь вы должны позволить расслоению знать, что вы хотите использовать пользовательскую форму:

# src/Acme/UserBundle/Resources/config/services.yml 
services: 
    acme_user.registration.form.type: 
     class: Acme\UserBundle\Form\Type\RegistrationFormType 
     arguments: [%fos_user.model.user.class%] 
     tags: 
      - { name: form.type, alias: acme_user_registration } 

Последний шаг рассказывать FOSUserBundle, что он будет использовать свой тип формы вместо используемого по умолчанию:

# app/config/config.yml 
fos_user: 
    # ... 
    registration: 
     form: 
      type: acme_user_registration 

Источник:

https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md#step-3-create-your-user-class
https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_forms.md

Смежные вопросы