我试图在我的网络应用程序中集成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)与公司表分开,并在公司和用户表之间建立一对一的关系。 显然,注册表需要有与用户和公司表相关的字段。
我该怎样做才能实现这样的目标?
答案 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
);
...