2016-12-16 4 views
1

Il existe un système de "nouvelles", lorsqu'un "nouveau" est ajouté, un e-mail doit également être envoyé.Où placer l'e-mail?

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

mais j'ai besoin aussi d'envoyer un e-mail, donc:

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

mais il semble étrange. Il semble que SRP soit violée

+1

Peut-être qu'il devrait être géré dans le contrôleur à la place du modèle? if ($ model-> add ($ nouveau)) $ mail-> send(); –

+0

mais une nouvelle "nouvelle" peut être ajoutée de n'importe où, et ainsi je devrais toujours appeler le contrôleur. Cela ne fonctionnerait pas –

Répondre

1

Il ressemble à SRP est violé

Il fait en effet. Lorsque vous devez faire plusieurs choses, vous pouvez appliquer le principe ouvert/fermé et tout découpler.

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); 
     } 
    } 
} 

Ensuite, vous pouvez l'utiliser comme ceci:

$news = new AggregatorNews(); 
$news->addNews(new SaveNews); 
$news->addNews(new SendNews); 

$news->add('bla bla'); 
+0

et pourquoi ne simplement étend simplement ORM? Pourquoi les ajouter à une liste? –

1

créer une nouvelle fonction sendEmail et y mettre le code.

et quand vous en avez besoin. appelez-le dans l'application entière.

2

Vous pouvez écrire un auditeur/planificateur qui pourrait chercher de nouveaux enregistrements dans la base de données, puis envoyer l'e-mail.

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

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

Ainsi SRP ne viole

+0

mais l'encapsulation fait :) l'encapsulation violée. Voir: http://stackoverflow.com/questions/11619680/why-should-the-observer-pattern-be-deprecated –

+1

Je suis d'accord. Tant que l'état de base n'est pas modifié, aucun mal n'est fait. Cependant, je laisserais à l'implémenteur le choix du principe que l'on est prêt à violer :-) – AJW