使用FOSUserBundle的多个注册表

时间:2015-07-03 12:56:05

标签: php symfony doctrine-orm fosuserbundle

我试图在我的网络应用程序中集成FOSUserBundle(基于symfony)。 我的申请需要有两种不同的注册表格;一个用于公司简介,另一个用于简单的用户档案。 我想将FOSUserBundle中的User实体与公司实体分开。 我试图从用户实体扩展公司;通过这种方式,可以很容易地创建一个这样的RegistrationFormType:

```

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

}

但我不想从用户实体扩展公司,因为这样,当我启动follow命令时:

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

要更新数据库架构,它应该将fos用户字段放在公司表中。 Insteed,我想将用户表(fos_user)与公司表分开,并在公司和用户表之间建立一对一的关系。 显然,注册表需要有与用户和公司表相关的字段。

我该怎样做才能实现这样的目标?

1 个答案:

答案 0 :(得分:0)

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

1)我创建了一个名为profile的新bundle,其中有一个profile实体,它与id字段上的默认User Enity有1-1映射。这是代码。

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

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

查询配置文件表后,您可以使用例如

直接访问用户实体
...
$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('john.doe@example.com');
$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
            );
...