我正在重新设计symfony2中的网站,用户必须能够取消订阅。
当他们这样做时,出于数据库完整性的原因,我们必须取消激活他们的帐户,而不是完全删除它。我们还必须在特定时间(法律义务)跟踪他们的个人信息,如电子邮件地址。
我使用的是FOSUserBundle,我最初想到一种简单的方法来取消订阅取消订阅的人的帐户,就是设置用户属性"启用"为假。
但是当用户未启用时,如果他尝试再次使用相同的电子邮件地址注册,他会看到:"电子邮件已被使用"。我希望他可以再次注册并创建一个新帐户(或重新激活旧帐户)。
有办法做到这一点吗? 是否有最佳做法来处理FOSUserBundle的取消订阅?
感谢您的帮助。
答案 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 }