2016-12-16 55 views
1

有一个“新闻”系统,当一个“新”被添加时,还应该发送一封电子邮件。何处发送电子邮件?

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违反

+1

也许应该在控制器,而不是模型来管理?如果($ model-> add($ new))$ mail-> send(); –

+0

,但是可以从任何地方添加新的“新闻”,并且这种方式我应该总是调用控制器。这不会工作 –

回答

1

它看起来像SRP违反

它确实。当你需要做很多事情时,你可以应用开放/封闭的原则,并解除一切。

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'); 
+0

,为什么不简单地扩展ORM?为什么要将它们添加到列表中? –

1

做一个新的sendEmail功能,并把代码放在那里。

当你需要它。在整个应用程序中调用它。

2

你可以写一个监听器/调度,可以寻找数据库中的新记录,然后发送电子邮件。

class ModelNews extends NewsORM 
{ 
    public function add ($new) 
    { 
     INSERT INTO newstable 
    } 
} 

class SendNews extends NewsListener 
{ 
    public function listen($news) { 
     mail-> send 
    } 
} 

因此SRP不受侵犯

+0

但封装确实:)封装违反。请参阅:http://stackoverflow.com/questions/11619680/why-should-the-observer-pattern-be-deprecated –

+1

我同意。只要核心国没有修改就不会造成伤害。但是,我会让实现者选择一个人愿意违反的原则:-) – AJW