draw/post-office-bundle

安装数: 3 177

依赖者: 0

建议者: 1

安全性: 0

星标: 0

关注者: 3

分支: 0

开放性问题: 0

类型:symfony-bundle


README

由于 Symfony/Mailer 尚未完成,某些行为可能在后续版本中受到影响,因此请将此包视为实验性的。

此包允许将电子邮件的创建委托给一个特定的类。

它还允许配置默认的 from

配置

draw_post_office:
  default_from: 'support@example.com'

您不是直接在控制器中构建电子邮件,而是创建一个继承自 Symfony\Component\Mime\Email 的类,并为它创建一个 "writer"。

实现 Draw\Bundle\PostOfficeBundle\Email\EmailWriterInterface 的任何服务都将注册为 writer。 getForEmails 必须返回一个映射,其中方法作为键,优先级作为值,以将方法注册为 writer(如果您返回方法作为值,它将考虑其优先级为 0)。系统将检测电子邮件是否与方法的第一个参数的类匹配,并在需要时调用它。

邮局声明了一个监听器来监听 Symfony\Component\Mailer\Event\MessageEvent,以便将其挂钩到 symfony 邮件器。

按照惯例,建议创建一个 Email 文件夹,在其中创建所有电子邮件类,以及实现 Draw\Bundle\PostOfficeBundle\Email\EmailWriterInterfacewriter 类。

示例

让我们创建一个忘记密码的电子邮件,该类将包含 最小 信息以构建电子邮件,在这种情况下是触发忘记密码电子邮件流程的用户电子邮件。

<?php namespace App\Email;

use Symfony\Bridge\Twig\Mime\TemplatedEmail;

class ForgotPasswordEmail extends TemplatedEmail
{
    private $emailAddress;

    public function __construct(string $emailAddress)
    {
        $this->emailAddress = $emailAddress;
        parent::__construct();
    }

    /**
     * The email address of the person who forgot is email
     */
    public function getEmailAddress(): string
    {
        return $this->emailAddress;
    }
}

我们必须为电子邮件创建一个 writer

<?php namespace App\Email;

use App\Email\ForgotPasswordEmail;
use App\LostPasswordTokenProvider;
use Draw\Bundle\PostOfficeBundle\Email\EmailWriterInterface;

class ForgotPasswordEmailWriter implements EmailWriterInterface
{
    private $lostPasswordTokenProvider;
    
    public function __construct(LostPasswordTokenProvider $lostPasswordTokenProvider)
    {
        $this->lostPasswordTokenProvider = $lostPasswordTokenProvider;
    }
    
     public static function getForEmails(): array
     {
         return ['compose']; // Or ['compose' => 0];
         
     }
    
    public function compose(ForgotPasswordEmail $forgotPasswordEmail)
    {
        $emailAddress = $forgotPasswordEmail->getEmailAddress();
        $forgotPasswordEmail
            ->to($emailAddress)
            ->subject('You have forgotten your password !')
            ->htmlTemplate('emails/forgot_password.html.twig')
            ->context([
                'token' => $this->lostPasswordTokenProvider->generateToken($emailAddress)
            ]);
    }
}

基本控制器示例

<?php namespace App\Controller;

use App\Email\ForgotPasswordEmail;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;

class ForgotPasswordController
{
    public function forgotPasswordAction(
        Request $request,
        MailerInterface $mailer
    ): Response {
        if ($request->getMethod() == Request::METHOD_GET) {
            return $this->render('users/forgot_password.html.twig');
        }

        // ... You should have a logic to validate there is a user and send a different email ... /
        $mailer->send(new ForgotPasswordEmail($request->request->get('email')));

        return new RedirectResponse($this->generateUrl('check_email'));
    }
}

这样,您可以保持控制器干净,并按结构编写和覆盖电子邮件。

系统还会将 Envelope 参数作为第二个参数传递,以防您需要它。

如果您查看 Draw\Bundle\PostOfficeBundle\Email\DefaultFromEmailWriter,您将看到如何创建一个在发送所有电子邮件时都会调用的 writer。