【问题标题】:Unsubscribe users in FOSUserBundle取消订阅 FOSUserBundle 中的用户
【发布时间】:2016-01-01 14:15:32
【问题描述】:

我正在 symfony2 中重新设计一个网站,用户必须能够取消订阅。

当他们这样做时,出于数据库完整性的原因,我们必须停用他们的帐户,而不是完全删除它。我们还必须在一段时间内跟踪他们的个人信息,例如电子邮件地址(法律义务)。

我正在使用 FOSUserBundle,我最初认为一种简单的方法来停用取消订阅者的帐户,将 User 属性“启用”设置为 false。

但是当用户未启用时,如果他尝试使用相同的电子邮件地址再次注册,他会看到:“该电子邮件已被使用”。我希望他可以再次注册并创建一个新帐户(或重新激活旧帐户)。

有没有办法做到这一点? 是否有使用 FOSUserBundle 处理取消订阅的最佳实践?

感谢您的帮助。

【问题讨论】:

    标签: symfony fosuserbundle


    【解决方案1】:

    您需要使用easyextendbundle 覆盖主注册过程,您可以查看此网址的文档:

    https://sonata-project.org/bundles/user/2-2/doc/reference/installation.html

    然后在您的扩展控制器中,您必须创建一个新操作来激活或停用您的用户,此操作必须在安全规则中公开。

    在此方法中,您可以使用服务来激活或停用用户:

    fos:user:deactivate 停用用户 fos:user:activate激活用户

    您可以从之前的这篇文章中获得灵感:Symfony2: List Users with Option to Deactivate Each User

    【讨论】:

    • 感谢您的回答。但这不是我的问题,我知道如何停用用户,这就是我已经在做的事情:我在前端创建了一个取消订阅操作,它会停用(启用 = false)用户。我更担心的是,停用的用户并不像未订阅的用户。主要是以后不能再注册了。所以我的问题是:您可以授权已停用的用户重新注册吗?如何?是不是要重写整个注册逻辑?
    【解决方案2】:

    另一种可能性是使用属性$subscribed 更新您的用户类,如下所示:

    /**
     *  @ORM\Column(name="subscribed", type="boolean")
     */
    protected $subscribed;
    
    public function setSubscribed($subscribed)
    {
        $this->subscribed = $subscribed;
    }
    
    public function isSubscribed($)
    {
        return $this->subscribed;
    }
    
    public function changeSubscribed()
    {
        $this->subscribed = !$this->subscribed;
    }
    

    这样可以避免电子邮件地址冲突,而无需添加另一个第三方捆绑包。

    编辑(还要注意上面的设置方法)

    在 YourBundle\EventListener 中

    use FOS\UserBundle\FOSUserEvents;
    use FOS\UserBundle\Event\FormEvent;
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    
    class RegistrationListener implements EventSubscriberInterface
    {
    
        public static function getSubscribedEvents()
        {
            return array(
                FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess',
            );
        }
    
        /**
         * Persist organization on staff registration success.
         *
         * @param \FOS\UserBundle\Event\FormEvent $event
         */
        public function onRegistrationSuccess(FormEvent $event)
        {
            /** @var $user \FOS\UserBundle\Model\UserInterface */
            $user = $event->getForm()->getData();
            $user->setSubscribed(true);
        }
    }
    

    另外,添加到 app/config/services.yml:

    your_bundle.regisration.listener:
        class: YourBundle\EventListener\RegistrationListener
        tags:
            - { name: kernel.event_subscriber }
    

    【讨论】:

    • 感谢您的回答。你如何将这个新属性与连接、注册等用户权限联系起来……你重写 FOSUserBundle 控制器吗?
    • 不确定您所说的“连接”是什么意思。对于注册,您可以添加一个注册侦听器,以便在注册成功时订阅用户。我将在我的答案中添加一个示例。
    • isSubscribed()方法被误删,现已恢复。
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2016-11-05
    • 2013-08-23
    • 2021-10-07
    • 2017-06-28
    相关资源
    最近更新 更多