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

Смежные вопросы