将电子邮件发送到哪里?
Where to put the email sending?
有"news"系统,添加"new"时,也要发邮件
class ModelNews extends NewsORM
{
public function add ($new)
{
INSERT INTO newstable
}
}
但是我还需要发邮件,所以:
class ModelNews extends NewsORM
{
public function add ($new)
{
INSERT INTO newstable
mail->send
}
}
但看起来很奇怪。似乎违反了 SRP
创建一个新的 sendEmail 函数并将代码放在那里。
在您需要的时候。在整个应用程序中调用它。
It looks like SRP is violated
确实如此。当您需要做多件事时,您可以应用 open/closed 原则并解耦所有内容。
interface AddNews
{
public function add($new);
}
class SaveNews extends NewsORM implements AddNews
{
public function add($new)
{
// INSERT INTO newstable
}
}
class SendNews extends NewsORM implements AddNews
{
public function add ($new)
{
//mail->send
}
}
class AggregatorNews implements AddNews
{
private $news = [];
public function addNews(AddNews $news)
{
$this->news[] = $news;
}
public function add($new)
{
foreach ($this->news as $obj) {
$obj->add($new);
}
}
}
那么你可以这样使用它:
$news = new AggregatorNews();
$news->addNews(new SaveNews);
$news->addNews(new SendNews);
$news->add('bla bla');
您可以编写一个 listener/scheduler 来查找数据库中的新记录,然后发送电子邮件。
class ModelNews extends NewsORM
{
public function add ($new)
{
INSERT INTO newstable
}
}
class SendNews extends NewsListener
{
public function listen($news) {
mail-> send
}
}
因此没有违反 SRP
有"news"系统,添加"new"时,也要发邮件
class ModelNews extends NewsORM
{
public function add ($new)
{
INSERT INTO newstable
}
}
但是我还需要发邮件,所以:
class ModelNews extends NewsORM
{
public function add ($new)
{
INSERT INTO newstable
mail->send
}
}
但看起来很奇怪。似乎违反了 SRP
创建一个新的 sendEmail 函数并将代码放在那里。
在您需要的时候。在整个应用程序中调用它。
It looks like SRP is violated
确实如此。当您需要做多件事时,您可以应用 open/closed 原则并解耦所有内容。
interface AddNews
{
public function add($new);
}
class SaveNews extends NewsORM implements AddNews
{
public function add($new)
{
// INSERT INTO newstable
}
}
class SendNews extends NewsORM implements AddNews
{
public function add ($new)
{
//mail->send
}
}
class AggregatorNews implements AddNews
{
private $news = [];
public function addNews(AddNews $news)
{
$this->news[] = $news;
}
public function add($new)
{
foreach ($this->news as $obj) {
$obj->add($new);
}
}
}
那么你可以这样使用它:
$news = new AggregatorNews();
$news->addNews(new SaveNews);
$news->addNews(new SendNews);
$news->add('bla bla');
您可以编写一个 listener/scheduler 来查找数据库中的新记录,然后发送电子邮件。
class ModelNews extends NewsORM
{
public function add ($new)
{
INSERT INTO newstable
}
}
class SendNews extends NewsListener
{
public function listen($news) {
mail-> send
}
}
因此没有违反 SRP