我一直在研究用于在论坛中创建线程的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模式搜索并找到了观察者设计模式。
此致 坦维尔
答案 0 :(得分:1)
ThreadCreator
处理需要跟进操作的活动。为了确保该操作可用,它会要求提供一个可以调用后续操作的对象。
代码重用。如果您在整个应用中使用了很多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);