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

に違反していませんか? if($ 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

関連する問題