Шаблон дизайна в исходном коде laravel io

Я изучал 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();
}

}

Мой вопрос, почему я должен пройти ThreadCreatorListeneг в ThreadCreator учебный класс ? Какую выгоду я получу от этого? Класс может легко вернуть некоторый код ошибки, например, возвращаемый массив («success» => true, «message» => «Обнаружен спам»); который решит цель.

Кроме того, это какой-то шаблон дизайна? Я гуглил с шаблоном дизайна слушателя и нашел шаблон дизайна наблюдателя.

С Уважением,
Tanvir

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]