2013-02-19 2 views
8

Sto tentando di estendere FOS UserBundle per consentire alle entità di profilo esteso di contenere ulteriori informazioni oltre ai campi base di UserBundle. Poiché sul sito sono presenti più tipi di utenti, ho creato entità separate per conservare le informazioni del profilo. Ho le entità costituite come segue:Aggiunta di entità profilo estesa a 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; 

La mia configurazione

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: { } 

Ho diversi altri tipi di utente con informazioni più specifiche che è drasticamente diverso, quindi ho bisogno le entità separate, per esempio I può avere un utente con 3 indirizzi, o ID dipendenti, ecc. Dato questo, come devo implementare il modulo di registrazione per creare informazioni sul profilo utente quando creo le informazioni UserBundle? Grazie in anticipo!

risposta

10

Se si utilizza MySQL e PHP per la definizione di entità, quindi è necessario creare la tua Entità come segue:

<?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 
    } 
} 

Il secondo passo è quello di creare si forma il tipo che chiede i campi che si desidera:

// 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'; 
    } 
} 

Ora è necessario lasciare che il fascio di sapere che si desidera utilizzare il modulo personalizzato:

# 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 } 

L'ultimo passo è di raccontare FOSUserBundle che userà il tipo di form invece di quello di default:

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

Fonte:

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