2016-12-16 51 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