php - Symfony FOSUserbundle - 在帐户创建时设置角色的最佳实践(使用数据库查询)

标签 php mysql symfony fosuserbundle

注册时,我想检查另一个表是否存在他们的用户名,如果存在,则为该用户设置另一个角色。

我会在用户事件构造函数、监听器、注册 Controller 中执行此操作吗?我尝试了其中的几个,但实际上在访问实体管理器以查询表时遇到了问题

所以我想在用户注册(或确认他们的电子邮件)时(在某个地方)运行

    $em = $this->getDoctrine()->getEntityManager();
    $uniID = preg_replace('/\D/', '', $user->getUsername());

    if ($em->getRepository('AppBundle:User')->userHasMembership($uniID) == 1) {
        $user->addRole('ROLE_MEMBER');
    } else {
        $user->removeRole('ROLE_MEMBER');
    }

    $em->persist($user);
    $em->flush();

现在我已经将实体管理器注入(inject)到我的服务中

app.registration_completed:
    class: UserBundle\EventListener\RegistrationConfirmListener
    arguments:
         - "@doctrine.orm.entity_manager"

我的事件监听器如下

类 RegistrationConfirmListener 实现 EventSubscriberInterface {

protected $em;
function __construct(EntityManager $em)
{
    $this->em = $em;
}

public static function getSubscribedEvents()
{
    return array(
        FOSUserEvents::REGISTRATION_CONFIRM => 'onRegistrationConfirm'
    );
}

public function onRegistrationConfirm(GetResponseUserEvent $event)
{
    $user = $event->getUser();
    $uniID = preg_replace('/\D/', '', $user->getUsername());

    if ($this->em->getRepository('AppBundle:User')->userHasMembership($uniID) == 1) {
        $roles = array('ROLE_USER', 'ROLE_MEMBER');
    } else {
        $roles = array('ROLE_USER');
    }
    $user->setRoles($roles);
}

最佳答案

您已发布有问题的错误。我建议您始终与您尝试过的代码共享错误,以便其他人能够解决问题。

请尝试以下。 只需在服务中传递 doctrine 对象参数并在 __construct() 中设置实体管理器。

services.yml

app.registration_completed:
    class: UserBundle\EventListener\RegistrationConfirmListener
    arguments:
         - "@doctrine"

RegistrationConfirmListener.php

class RegistrationConfirmListener implements EventSubscriberInterface {

    protected $em;

    function __construct(Doctrine $doctrine) // Get doctrine argument
    {
        $this->em = $doctrine->getEntityManager();
    }

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_CONFIRM => 'onRegistrationConfirm'
        );
    }

    public function onRegistrationConfirm(GetResponseUserEvent $event)
    {
        $user = $event->getUser();
        $uniID = preg_replace('/\D/', '', $user->getUsername());

        if ($this->em->getRepository('AppBundle:User')->userHasMembership($uniID) == 1) {
            $roles = array('ROLE_USER', 'ROLE_MEMBER');
        } else {
            $roles = array('ROLE_USER');
        }
        $user->setRoles($roles);
    }
}

它在 Symfony 2.3 中运行良好

关于php - Symfony FOSUserbundle - 在帐户创建时设置角色的最佳实践(使用数据库查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499123/

相关文章:

javascript - 如何调用HasOffers中的Api并建立服务器和客户端的连接

php - MySQL 在同一列中按 ASC 和 DESC 排序

symfony - 无法在 Symfony2 中启用 SoftDeleteable - 无法识别的选项 "filters"

php - 使用 Doctrine Query Builder 通过内连接查询创建组

php - 使用 PHP for 和 foreach 循环从 JSON 数据中检索视频信息时遇到问题 - YouTube API 3

php - 我如何将 MySQL 数据库中的这个日期时间与现在进行比较?

php - WordPress - 在主题选项面板中执行 PHP

php - MySQL Regex 匹配通配符和出现次数

php - Yii findAllByAttributes 单个表中两个日期之间的值

php - 是否有在 Symfony2 应用程序中生成脚手架的工具?