2015-07-03 96 views
1

我试图将FOSUserBundle整合到我的web应用程序(基于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 

要更新数据库模式,应该在公司表中放置fos用户字段。 保证,我想保持用户表(fos_user)与公司表分开,并在公司和用户表之间建立一对一的关系。 显然,注册表格需要有与用户和公司表相关的字段。

我该如何做到这样的事情?

回答

0

我用Symfony和FOSUserBundle创建了我的social network。我遇到了类似的挑战,并会详细解释我是如何解决它的。

1)我创建了一个新的包,其中包含一个配置文件实体,该配置文件实例与id字段上的默认用户实体具有1-1映射关系。这是代码。

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

我只需要更改配置文件实体。您可以不改变用户实体。我发现这更容易管理配置文件和配置文件缓存,同时保留默认的用户实体或多或少不变。因此,现在每个其他相关实体都将加入到配置文件实体和User Enity中,仅用于管理用户,即用户创建,登录,删除等。

一旦您查询配置文件表,就可以直接使用eg访问用户实体

... 
$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 
      ); 
...