Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 取消订阅FOSUserBundle中的用户_Symfony_Fosuserbundle - Fatal编程技术网

Symfony 取消订阅FOSUserBundle中的用户

Symfony 取消订阅FOSUserBundle中的用户,symfony,fosuserbundle,Symfony,Fosuserbundle,我正在用symfony2重新设计一个网站,用户必须能够取消订阅 当他们这样做时,出于数据库完整性的原因,我们必须取消激活他们的帐户,而不是完全删除它。我们还必须在一定时间内跟踪他们的个人信息,如电子邮件地址(法律义务) 我使用的是FOSUserBundle,我最初认为停用未订阅用户帐户的简单方法是将用户属性“enabled”设置为false 但当用户未启用时,如果他尝试使用相同的电子邮件地址再次注册,他会看到:“电子邮件已被使用”。我希望他可以再次注册并创建一个新帐户(或重新激活旧帐户) 有办法

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

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

我使用的是FOSUserBundle,我最初认为停用未订阅用户帐户的简单方法是将用户属性“enabled”设置为false

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

有办法做到这一点吗? 是否有处理FOSUserBundle退订的最佳实践


感谢您的帮助。

您需要使用
easyextendbundle
覆盖主注册过程,您可以查看以下url上的文档:

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

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

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


您可以从前面的帖子中得到启发:

另一种可能是使用属性
$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;
}
这避免了电子邮件地址冲突,而无需添加另一个第三方包

编辑(请注意,也可设置上述方法)

在您的bundle\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 }

谢谢你的回答。但这不是我的问题,我知道如何停用用户,这是我已经做过的:我在前端创建了一个取消订阅的操作,它停用(enabled=false)用户。我更关心的是,一个停用的用户并不像一个未订阅的用户;主要是,他以后不能再注册了。所以我的问题是:你能授权一个停用的用户再次注册吗?如何授权?你必须重写整个注册逻辑吗?谢谢你的回答。如何将此新属性与用户权限(如连接、注册等)链接。。。您是否重写FOSUserBundle控制器?不确定“连接”是什么意思。对于register,您可以添加注册侦听器,以便在注册成功时订阅用户。我将在回答中添加一个示例。
isSubscribed()
方法被错误删除,现在已恢复。