将电子邮件发送到哪里?

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