【问题标题】:symfony2 FOSUserBundle generate alphanumeric username [closed]symfony2 FOSUserBundle 生成字母数字用户名 [关闭]
【发布时间】:2015-08-19 16:09:43
【问题描述】:

在我的 Symfony 项目中,我有不同类型的用户: 2 个 id 为 1 和 2 的管理员帐户,用户名可以是任何东西 公司的100个账号,id为3-102,用户名必须是AA001到AA100 以及用户名为AA101、AA102、...的普通用户的账户

这两个管理员账户和公司的账户我会创建一个 symfony 命令来生成它们。

我的问题是如何为将使用注册表单的其他人生成用户名,以便第一个注册其用户名的人是 AA101 等等

我的第一个想法: 恢复 id max (maxid) 并使用 ($username = 'AA'.maxid-1) 但是如果两个用户同时注册会发生什么

第二个想法: 持久化实体并获取其 ID(afterpersist 事件)并使用 ($username = 'AA'.id-2) 此方法避免了两个帐户具有相同用户名的风险 但是在持久化之前要在用户名中输入什么

我不知道从哪里开始,哪种方法最好。 所以任何建议或任何想法都会非常有帮助

PS:对不起我的英语

【问题讨论】:

  • 其实第二个想法比第一个好,默认你可以设置用户名到某个默认值,然后它会被改变

标签: symfony fosuserbundle alphanumeric


【解决方案1】:

我现在的解决方案

用户类

<?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 persist 事件监听器

<?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 的类名是Users 而不是Users 的实例? 如果没有 if 语句,将为每个实体执行代码

【讨论】:

  • php 函数 is_a($user,'Users') 给出 false is_a($user,'FM\FmBundle\Entity\Users') 给出 true,所以我可以使用 if 语句
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多