symfony2 FOSUserBundle 生成字母数字用户名
symfony2 FOSUserBundle generate alphanumeric username
在我的 Symfony 项目中,我有不同类型的用户:
2 个管理员帐户,ID 为 1 和 2,用户名可以是任何内容
公司ID为3-102的100个账号,用户名必须是AA001到AA100
以及用户名为 AA101、AA102、...
的普通用户帐户
这两个管理员帐户和公司帐户我将创建一个 symfony 命令来生成它们。
我的问题是如何为将要使用注册表单的其他人生成用户名,以便第一个注册用户名的人是 AA101 等等
我的第一个想法:
恢复 id 最大值 (maxid) 并使用 ($username = 'AA'.maxid-1)
但是如果两个用户同时注册会发生什么
第二个想法:
保留实体并获取其 ID(afterpersist 事件)并使用($username = 'AA'.id-2)
此方法避免了两个帐户具有相同用户名的风险
但是在坚持之前要在用户名中输入什么
我不知道从哪里开始,哪种方法最好。
所以任何建议或想法都会很有帮助
PS:对不起我的英语
我现在的解决方案
用户class
<?php
namespace FM\FmBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class Users extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
// your own logic
}
public function setEmail($email){
parent::setEmail($email);
parent::setUsername($email);
}
}
post 持续事件侦听器
<?php
namespace FM\FmBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PostFlushEventArgs;
class UserPostPersistListener
{
private $needsFlush;
public function __construct(){
$this->needsFlush=false;
}
public function postPersist(LifecycleEventArgs $args)
{
$user = $args->getEntity();
$em = $args->getEntityManager();
if($user instanceof Users) {
$number=$user->getId()-2;
$user->setUsername('AA'.$number);
}
$em->persist($user);
$this->needsFlush = true;
}
public function postFlush(PostFlushEventArgs $eventArgs)
{
if ($this->needsFlush) {
$this->needsFlush = false;
$eventArgs->getEntityManager()->flush();
}
}
}
app/config/service.yml
fmarketUserPostPersistListner:
class: FM\FmBundle\EventListener\UserPostPersistListener
tags:
- { name: doctrine.event_listener, event: postPersist }
app/config/security.yml
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
但没有发生任何事情,用户名仍然与用户电子邮件相同,
当我替换
if($user instanceof Users) {
$number=$user->getId()-2;
$user->setUsername('AA'.$number);
}
来自
$number=$user->getId()-2;
$user->setUsername('AA'.$number);
它工作正常
我在 if
之前尝试过这个
dump(get_class($user));
dump($user instanceof Users); die;
它给
UserPostPersistListener.php on line 17:
"FM\FmBundle\Entity\Users"
UserPostPersistListener.php on line 18:
false
我的问题是为什么 $user 的 class 名称是 Users 而不是 Users 的实例?
如果没有 if 语句,将为每个实体执行代码
在我的 Symfony 项目中,我有不同类型的用户: 2 个管理员帐户,ID 为 1 和 2,用户名可以是任何内容 公司ID为3-102的100个账号,用户名必须是AA001到AA100 以及用户名为 AA101、AA102、...
的普通用户帐户这两个管理员帐户和公司帐户我将创建一个 symfony 命令来生成它们。
我的问题是如何为将要使用注册表单的其他人生成用户名,以便第一个注册用户名的人是 AA101 等等
我的第一个想法: 恢复 id 最大值 (maxid) 并使用 ($username = 'AA'.maxid-1) 但是如果两个用户同时注册会发生什么
第二个想法: 保留实体并获取其 ID(afterpersist 事件)并使用($username = 'AA'.id-2) 此方法避免了两个帐户具有相同用户名的风险 但是在坚持之前要在用户名中输入什么
我不知道从哪里开始,哪种方法最好。 所以任何建议或想法都会很有帮助
PS:对不起我的英语
我现在的解决方案
用户class
<?php
namespace FM\FmBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class Users extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
// your own logic
}
public function setEmail($email){
parent::setEmail($email);
parent::setUsername($email);
}
}
post 持续事件侦听器
<?php
namespace FM\FmBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PostFlushEventArgs;
class UserPostPersistListener
{
private $needsFlush;
public function __construct(){
$this->needsFlush=false;
}
public function postPersist(LifecycleEventArgs $args)
{
$user = $args->getEntity();
$em = $args->getEntityManager();
if($user instanceof Users) {
$number=$user->getId()-2;
$user->setUsername('AA'.$number);
}
$em->persist($user);
$this->needsFlush = true;
}
public function postFlush(PostFlushEventArgs $eventArgs)
{
if ($this->needsFlush) {
$this->needsFlush = false;
$eventArgs->getEntityManager()->flush();
}
}
}
app/config/service.yml
fmarketUserPostPersistListner:
class: FM\FmBundle\EventListener\UserPostPersistListener
tags:
- { name: doctrine.event_listener, event: postPersist }
app/config/security.yml
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
但没有发生任何事情,用户名仍然与用户电子邮件相同, 当我替换
if($user instanceof Users) {
$number=$user->getId()-2;
$user->setUsername('AA'.$number);
}
来自
$number=$user->getId()-2;
$user->setUsername('AA'.$number);
它工作正常
我在 if
之前尝试过这个dump(get_class($user));
dump($user instanceof Users); die;
它给
UserPostPersistListener.php on line 17:
"FM\FmBundle\Entity\Users"
UserPostPersistListener.php on line 18:
false
我的问题是为什么 $user 的 class 名称是 Users 而不是 Users 的实例? 如果没有 if 语句,将为每个实体执行代码