laravel io源代码中的设计模式

时间:2016-07-30 18:33:19

标签: php laravel software-design

我一直在研究用于在论坛中创建线程的laravel io(https://github.com/laravelio/laravel.io/tree/master/app/Forum/Threads)源代码。首先,请求来到 ForumThreadController 。控制器调用负责创建线程的 ThreadCreator 类。这个类首先检查主题和正文的垃圾邮件。如果是垃圾邮件,则返回错误,否则创建线程。

interface ThreadCreatorListener
{
      public function threadCreationError();
      public function threadCreated();
} 

class ForumThreadController implements ThreadCreatorListener
{
       public function __construct(ThreadCreator $threadCreator)
       {
           $this->threadCreator = $threadCreator;
       }

       public function threadCreationError()
       {
             return $this->redirectBack(['errors' => $errors]);
       }

       public function threadCreated($thread)
       {
           return $this->redirectAction('Forum\ForumThreadsController@getShowThread', [$thread->slug]);
       }

       public function postCreateThread()
       {
                 $threadSubject = $request->get('subject');
                 $threadBody = $request->get('body');

                 return $this->threadCreator->create($this , $threadSubject);
        }
}

class ThreadCreator
{
       private $spamDetector;

       public function __construct(SpamDetector spamDetector)
       {
                $this->spamDetector = spamDetector;
       }

       public functin create(ThreadCreatorListener $listener , $subject)
       {
               if($this->spamDetector->isSpam($subject))
               {
                      return $listener->threadCreationError("Subject is spam");
               }

               return $listener->threadCreated();
       }

}

我的问题是为什么我应该在 ThreadCreator 类中传递 ThreadCreatorListene ?这有什么好处?该类可以轻松返回一些错误代码,例如返回数组('成功' => true,'消息' =>'检测到垃圾邮件');这将解决目的。

另外,这是某种设计模式吗?我用goper desing模式搜索并找到了观察者设计模式。

此致 坦维尔

1 个答案:

答案 0 :(得分:1)

  1. ThreadCreator处理需要跟进操作的活动。为了确保该操作可用,它会要求提供一个可以调用后续操作的对象。

  2. 代码重用。如果您在整个应用中使用了很多ThreadCreator,那么您会发现自己会对每次使用的结果做出反应。

    # bad - Easy to have out of date copy-paste
    if ($has_spam == (new ThreadCreator($subject))) {
        // do something
        // maybe call a function
    }
    
    # good - Always obeys ForumThreadController
    $thread_creator = (new ThreadCreator())
        ->create(new ForumThreadController, $subject);