optimeconsulting / sf-emails
此包最新版本(dev-master)没有可用的许可证信息。
dev-master / 4.1.x-dev
2024-05-09 21:28 UTC
Requires
- php: ^8.1
- knplabs/knp-paginator-bundle: ^5.8|^6.0
- optimeconsulting/sf-utils: ^6.3.8
- symfony/framework-bundle: ^6.3|^7.0
- symfony/string: *
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_DSN
为 MAILER_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,并让用户能在浏览器中查看邮件内容。