Search code examples
phpemailormsingle-responsibility-principle

Where to put the email sending?


There is a "news" system, when a "new" is added, an email should be sent too.

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

but I also need to send an email, so:

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

but it looks odd. It looks like SRP is violated


Solution

  • It looks like SRP is violated

    It does indeed. When you need to do multiple things you can apply the open/closed principle and decouple everything.

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

    Then you can use it like this:

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