取消订阅FOSUserBundle中的用户

时间:2016-01-01 14:15:33

标签: symfony fosuserbundle

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

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

我使用的是FOSUserBundle,我最初想到一种简单的方法来取消订阅取消订阅的人的帐户,就是设置用户属性"启用"为假。

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

有办法做到这一点吗? 是否有最佳做法来处理FOSUserBundle的取消订阅?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您需要使用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

答案 1 :(得分:0)

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

/**
 *  @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 }