试图遵循设计模式并在中途陷入困境。任务是这样的,有 3 种发送消息的方式(邮件、短信、电报),邮件中还有 3 个选项(因为程序中有 3 个不同的工作模块,然后是信件的传入数据类型是不同的,就像字母模板本身一样)。
我设法用这样的工厂方法完成了第一部分:
信使界面
<?php
declare(strict_types = 1);
namespace App\Http\Controllers\Email\Interfaces;
interface MessengerInterface
{
public function send();
}
邮件信使
<?php
declare(strict_types = 1);
namespace App\Http\Controllers\Email;
use App\Http\Controllers\Email\Interfaces\MessengerInterface;
class MailMessenger implements MessengerInterface
{
public function __construct(
String $fromAddress,
String $toAddress,
Boolean $inbox,
String $messageText,
String $messageHtml,
)
{
}
public function send()
{
return '';
}
}
信使工厂
<?php
declare(strict_types = 1);
namespace App\Http\Controllers\Email\Interfaces;
interface MessengerFactory
{
public function createMessenger() : MessengerInterface;
}
信使工厂
<?php
declare(strict_types = 1);
namespace App\Http\Controllers\Email;
use App\Http\Controllers\Email\MailMessenger;
use App\Http\Controllers\Email\Interfaces\MessengerFactory;
class MailMessengerFactory implements MessengerFactory
{
public function createMessenger() : MessengerInterface
{
return new MailMessenger;
}
}
但是如何通过邮件本身内部的模板来分割 - xs. 更准确地说,xs 如何使用设计模式来做到这一点。鉴于我仍然不明白为什么这么简单的事情,使用模板,我需要多达 2 个类,尽管对我来说,1 就足够了
你开始正确,只有消息和收件人(你系统中的用户)应该被放入方法中,因为这是一般数据,并且一次可以发送多次信件:
接下来,您创建多个实现:
然后只需在您的 DI 中(通过 Laravel 中的服务提供者或通过 Symphony 中的 service.yml 等)替换实现,并且整个系统的代码仅依赖于具有相同接口的 send():
为了不在DI中手动放类,可以创建一个工厂,会有这样的东西:
或者,例如,您需要使邮件列表同时成为多个邮件者:
补充工厂(对于任何博客,我采用或多或少的中等复杂系统的架构 - 开销)。实现可以改变,这里的要点是:
最重要的是,您的控制器根本不需要知道正在使用什么信使。反过来,您在服务提供商中设置(您有 Laravel) - 首先是什么信使(邮件或 viber),如果是邮件,然后为它选择所需的信函模板工厂(冬季、夏季等)。如有必要,您还可以为 viber 创建任何模板。一切都取决于要求。
如果我们进一步抽象。为什么我们特别提到用户(我们向其发送信件),他的班级?这打破了 SOLID 的 D - 我们应该只依赖接口。我们还能给谁寄信?假设我们有实体组织/批发商——就是这样,我们不能给他们发信。如何解决?我们以 MessageTargetInterface 抽象为例
这就是全部,现在: 1) 我们可以向任何实体发送信件和消息——甚至是用户,甚至是组织,甚至是天网。最主要的是他们有一个界面,可以保证他们有电话和电子邮件。+ 我们可以在不更改模板和发送方法的情况下输入任意数量的此类实体。2) 我们可以向这些实体中的任何一个发送信件、电子邮件、电话、机器人拨号。正是我们能想到的。