2015-07-03 3 views
1

Я пытаюсь интегрировать FOSUserBundle в своем веб-приложении (на основе symfony). Мое приложение должно иметь две разные формы регистрации; один для профиля компании и один для простого профиля пользователя. Я хотел бы, чтобы пользовательский объект из FOSUserBundle был отделен от компании. Я попытался расширить компанию из пользовательского объекта; таким образом, это легко создать RegistrationFormType так:Несколько форм регистрации с FOSUserBundle

`` `

class RegistrationFormType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // add your custom field 
     $builder->add('name'); 
     $builder->add('works', 'entity', array(
      'class' => 'SkaLabFrontEndBundle:Works', 
      'property' => 'name' 
     )); 

     $builder->add('address'); 
     .... 
    } 

    $builder->add('email'); 
    $builder->add('username'); 
    $builder->add('plainPassword', 'repeated', array(
     'type' => 'password', 
     'invalid_message' => 'The password fields must match.', 
     'options' => array('attr' => array('class' => 'password-field')), 
     'required' => true, 
     'first_options' => array('label' => 'Password'), 
     'second_options' => array('label' => 'Repeat Password'))); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'SkaLab\Bundle\UserBundle\Entity\User' 
     )); 
    } 

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

} 

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

php app/console doctrine:schema:update --force 

, чтобы обновить схему db, он должен поместить поля пользователя fos в таблицу компаний. Insteed, я бы хотел, чтобы пользовательская таблица (fos_user) отделена от таблицы компании и выполняла взаимно-однозначные отношения между таблицей компаний и пользователей. Очевидно, что в регистрационной форме должны быть поля, связанные с таблицей пользователя и компании.

Как я могу реализовать что-то подобное?

ответ

0

Я создал свой social network с помощью Symfony и FOSUserBundle. Я столкнулся с подобной проблемой и подробно объясню, как я ее решил.

1) Я создал новый пакет, называемый профилями, внутри которых лежит объект профиля, который имеет 1-1-отображение с моим пользовательским Enity по умолчанию в поле id. Вот код.

.... 
class AcmeProfiles 
    { 
    /** 
    * @ORM\Id 
    * @ORM\OneToOne(targetEntity="\AcmeBundle\UserBundle\Entity\User") 
    * @ORM\JoinColumn(name="id", referencedColumnName="id") 
    */ 
    protected $id; 
... 

Мне нужно было только изменить профиль профиля. Вы можете оставить объект пользователя нетронутым. Мне было легче управлять профилями и кешем профиля, оставив по умолчанию User Entity более или менее нетронутым. Таким образом, теперь каждый другой связанный объект будет присоединен к объекту профиля и User Enity только для управления пользователями, то есть для создания пользователя, входа в систему, удаления и т. Д.

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

... 
$user_name = $acme_profile->getId()->getUsername(); 
$user_id = $acme_profile->getId()->getId(); 
$user_email = $acme_profile->getId()->getEmail(); 
.... 

2) Регистрация новых пользователей с расширенными формами и т. Д. Теперь я здесь столько часов размышлял. Позвольте мне вновь представить вам функцию FOSUser, которую люди принимают как должное, UserManager! Не беспокойтесь, переопределяя FOSUserBundle, чтобы делать простые вещи. Используйте UserManager, чтобы создать неограниченные формы и формы регистрации. Это так просто, назовите его в своем контроллере, как это

... 
$userManager = $this->get('fos_user.user_manager'); 

// Create a new User 
$user = $userManager->createUser(); 
$user->setUsername('John'); 
$user->setEmail('[email protected]'); 
$userManager->updateUser($user); 
... 

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

... 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 
... 

    if ($form->isValid()){ 
     $username = strip_tags($request->get('username')); 
     $email = strip_tags($request->get('email')); 
     $password = $request->get('password'); 

     $userManager = $this->get('fos_user.user_manager'); 

     $user_email_exists = $userManager->findUserByEmail($email); 
     $user_username_exists = $userManager->findUserByUsername($username); 

     $user_exists = 0; 
     if($user_email_exists){ 
      $request->getSession()->getFlashBag()->add(
       'error', 
       'The chosen email ' . $email . ' is already in use' 
      ); 
      $user_exists = $user_exists + 1; 
     } 
     if($user_username_exists){ 
      $request->getSession()->getFlashBag()->add(
       'error', 
       'The chosen username ' . $username . ' is already in use' 
      ); 
      $user_exists = $user_exists + 1; 
     } 
     if($user_exists > 0){ 
      return $this->redirect($this-> 
       generateUrl(
        'registration_page' 
       ) 
      ); 
     } 
     else{ 
      $new_user = $userManager->createUser(); 
      $new_user->setUsername($username); 
      $new_user->setEmail($email); 
      $new_user->setPlainPassword($password); 
      $new_user->setEnabled(true); 
      $userManager->updateUser($new_user); 

      $firstname = strip_tags($form->get('firstname')->getData()); 
      $lastname = strip_tags($form->get('lastname')->getData()); 

.... 
      $em->flush(); 

      $token = new UsernamePasswordToken($new_user, $new_user->getPassword(), 'main', $new_user->getRoles()); 

      $context = $this->get('security.context'); 
      $context->setToken($token); 

      $request->getSession()->getFlashBag()->add(
       'success', 
       'Congrats '.$firstname.', You Have Successfully Created Your Profile 
      ); 
... 
Смежные вопросы