在FOSUserBundle中手动为用户发送密码重置电子邮件

时间:2018-01-30 11:13:10

标签: symfony fosuserbundle symfony-3.3

我必须为symfony 3项目创建一个简单的用户管理。

其中一部分是为用户启动密码重置过程。 (是的,我知道每个用户都可以自己触发它,但这是我们客户的要求。)

现在我不知道如何通过在每个用户的管理界面中单击一下来启动该过程。我可以使用UserBundle中的方法或服务吗?

3 个答案:

答案 0 :(得分:4)

没有all in one方法,但可以通过以下方式实现:

if (null === $user->getConfirmationToken()) {
    $user->setConfirmationToken($this->tokenGenerator->generateToken());
}

// send email you requested
$this->mailer->sendResettingEmailMessage($user);
// this depends on requirements
$user->setPasswordRequestedAt(new \DateTime());
$this->userManager->updateUser($user);

设置适当的依赖项。

答案 1 :(得分:1)

根据卡米尔提供的信息,这将是一个完整的工作职能

if let num = dict["num"] as? NSNumber {
       let floatValue = num.floatValue
        print("Value is \(floatValue)")
} else {
        print("parse error")
}

答案 2 :(得分:1)

这是一个用Symfony 4.1编写的基于服务的解决方案,您可以使用它而不必通过get()从容器中调用服务

首先,您必须为services.yaml添加一个别名,因为FOS邮件程序无法自动连线:

FOS\UserBundle\Mailer\Mailer:
    alias: fos_user.mailer.default
    public: true

有了这个,您可以创建以下类作为服务:

namespace App\Service; # change to your namespace

use FOS\UserBundle\Mailer\Mailer;
use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;

/**
 * Class UserPasswordResetService
 */
class UserPasswordResetService
{
    /**
     * @var Mailer
     */
    private $mailer;

    /**
     * @var UserManagerInterface
     */
    private $userManager;

    /**
     * @var TokenGeneratorInterface
     */
    private $tokenGenerator;

    /**
     * UserPasswordResetService constructor.
     *
     * @param Mailer               $mailer
     * @param UserManagerInterface $userManager
     */
    public function __construct(
        Mailer $mailer,
        UserManagerInterface $userManager,
        TokenGeneratorInterface $tokenGenerator
    )
    {
        $this->mailer         = $mailer;
        $this->userManager    = $userManager;
        $this->tokenGenerator = $tokenGenerator;
    }

    /**
     * @param UserInterface $user
     */
    public function resetPassword(UserInterface $user)
    {
        if (null === $user->getConfirmationToken()) {
            $user->setConfirmationToken($this->tokenGenerator->generateToken());
        }

        // send email you requested
        $this->mailer->sendResettingEmailMessage($user);

        // this depends on requirements
        $user->setPasswordRequestedAt(new \DateTime());
        $this->userManager->updateUser($user);
    }

}

假设您随后通过DI将服务添加到类中,则可以在给定方法中像这样使用它:

$this->passwordResetService->resetPassword($user);