optimeconsulting/sf-emails

此包最新版本(dev-master)没有可用的许可证信息。

安装数: 2,177

依赖: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 2

语言:JavaScript

dev-master / 4.1.x-dev 2024-05-09 21:28 UTC

This package is auto-updated.

Last update: 2024-09-09 22:21:09 UTC


README

管理邮件发送和内容的捆绑包。

安装

必须安装和配置 sf-utils 捆绑包

然后执行

composer require "optimeconsulting/sf-emails" "~4.1@dev"

配置

将捆绑包添加到 config/bundles.php

<?php

return [
    ...
    Optime\Email\Bundle\OptimeEmailBundle::class => ['all' => true],
];

选项配置

创建/调整 config/packages/optime_emails.yaml 文件

# Por ahora sin nada que agregar, no se necesita crea el archivo

创建 config/routes/optime_emails.yaml 文件

optime_emails:
  resource: "@OptimeEmailBundle/Controller/"
  prefix:   /{_locale}/admin/emails
  type:     attribute

重要

如果未设置此变量的实际值,请配置环境变量 MAILER_DSNMAILER_DSN=null://null

创建 EmailApp 实体

EmailApp 类必须实现 Optime\Email\Bundle\Entity\EmailAppInterface 接口

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Optime\Email\Bundle\Entity\EmailAppInterface;

#[ORM\Entity]
class EmailApp implements EmailAppInterface
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private ?int $id;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function __toString(): string
    {
        return (string)$this->getId();
    }

    public function getFromEmail(): string
    {
        return 'from@from.com';
    }

    public function getFromName(): string
    {
        return 'From Name';
    }
}

注意:如果项目正在使用注解,则 EmailApp 实体也应使用注解而不是 PHP 属性。

config/packages/doctrine.yaml 中添加 EmailApp 实体的配置

doctrine:
    ...
    orm:
        ...
        resolve_target_entities:
            Optime\Email\Bundle\Entity\EmailAppInterface: App\Entity\EmailApp

运行 doctrine 命令

symfony console doctrine:schema:update -f

重要

此捆绑包需要 sfutils 捆绑包,它将自动安装。不过,仍然需要按照其 文档 进行配置。

还需要安装和配置 doctrine 扩展,特别是翻译扩展,请按照 StofDoctrineExtensionsBundle 捆绑包的文档操作。

使用方法

基本示例

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory
    ) {
    }

    public function send(User $user): void
    {
        $intent = $this->factory->create('template_code_xxx');
        
        $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
        $variables = [
            'first_name' => $user->firstName(),
            'last_name' => $user->lastName(),
        ];

        $intent->send($variables, $recipient);
    }
}

自定义 EmailApp

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;
use App\Repository\EmailAppRepository;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory,
        private EmailAppRepository $appRepository,
    ) {
    }

    public function send(User $user): void
    {
        $app = $this->appRepository->find(3);
        $intent = $this->factory->create('template_code_xxx', $app);
        
        $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
        $variables = [
            'first_name' => $user->firstName(),
            'last_name' => $user->lastName(),
        ];

        $intent->send($variables, $recipient);
    }
}

多个用户

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;
use App\Repository\EmailAppRepository;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory,
        private EmailAppRepository $appRepository,
    ) {
    }

    public function send(User $userA, User $userB, User $userC): void
    {
        $app = $this->appRepository->find(3);
        $intent = $this->factory->create('template_code_xxx', $app);
        
        foreach([$userA, $userB, $userC] as $user) {
                    
            $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
            
            $variables = [
                'first_name' => $user->firstName(),
                'last_name' => $user->lastName(),
                '_locale' => $user->getLocale(), // opcional, si se pasa se usa ese valor para los textos, y si no, se usa el locale de la petición actual.
            ];

            $intent->send($variables, $recipient);
        }
    }
}

应用解析器

use Optime\Email\Bundle\Service\Email\MailerFactory;
use Optime\Email\Bundle\Service\Email\Recipient\EmailRecipient;
use App\Repository\EmailAppRepository;
use Optime\Email\Bundle\Service\Email\App\EmailAppResolver;

class XXXMailerSender
{
    public function __construct(
        private MailerFactory $factory,
        private EmailAppRepository $appRepository,
    ) {
    }

    public function send(Event $event, User $user): void
    {
        $appResolver = new EmailAppResolver(function() use ($event) {
            return $this->appRepository->findByEvent($event)
        });
    
        $intent = $this->factory->create('template_code_xxx', $appResolver);
        
        $recipient = new EmailRecipient($user->getEmail(), $user->firstName());
        $variables = [
            'first_name' => $user->firstName(),
            'last_name' => $user->lastName(),
        ];

        $intent->send($variables, $recipient);
    }
}

变量 _email_id

所有模板都提供了一个特殊变量 _email_id,它包含邮件日志的 uuid,可以据此生成 URL,并让用户能在浏览器中查看邮件内容。