Какой код нужно переносить в отдельные классы?

Привет!

Не могу понять в какой момент повторяющийся код стоит переносить в отдельные классы (назовем их handler(ами)) из контроллеров.
  • Предположим в контроллере есть такой код $result = ['my_data' => $var]; а где то в другом контроллере строчка повторяется. И теперь из-за этого нужно придумывать название handler(а) характеризующий данный процесс и переносить код туда?
  • А если контроллер выполняет одновременно 5 больших действий? Мне все это придется переносить в 1 handler(а)? Получится God класс (это не есть хорошо), но и отделить я их не могу так как код связан очень сильно.


В общем наставьте на путь истинный.
  • Вопрос задан
  • 501 просмотр
Пригласить эксперта
Ответы на вопрос 1
sayber
@sayber
Да, я программирую на PHP и еще асинхронно!
Не надо называть из хендлерами.
Если брать пример $result = ['my_data' => $var];
То не надо конечно. Но я понимаю о чем вы. Хотя если оперировать объектами в полной мере, то можно создать что то типа responseMyData

Контроллер принимает реквест и отдает респонс, вызывая хендлр. Больше в нем не должно быть и строчки кода.
За исключением каких то индивидуальных реализаций. Вот пример моих контроллеров. Убрал под

Код котроллера - спойлер
<?php

class orderController extends AbstractController {

    /**
     * @ApiDoc(
     *     section="travelSystem",
     *     input=OrderRequest::class,
     *     statusCodes={
     *          200="sucess",
     *          404="Order not found"
     *     },
     *     views={"night_build"}
     * )
     * @RestDoc(
     *     security={Access::ORDER}
     * )
     * 
     * @return Response
     */
    public function orderAction(OrderRequest $orderRequest): Response
    {
        // Команда - простой объект с геттерами
        $command = new orderCommand(
            $orderRequest->getHotel(),
            $orderRequest->getCheckIn()
        );
        // Хендлер - в котором как раз и происходят все 
        // нужные нам операции по обработке
        $this->get('commandBus')->handle($command);

        return $this->responseForRest();
    }
}


Как вы видите, тут имеются свои особенности, но котроллер тоненький.
Что же происходит в текущем хендлере?
Там проверяется существование дублирующих записей (а это вызов репы и условие), далее вызывается модель для order, которая получает команды и уходит на запись. Это приходится дублировать, т.к. код по сути индивидуальный для каждого обработчика но схож по функционалу.

А вот после записи в БД, вызывается слушатель, который вызывает событие на запись логов.
Данная операция нужна везде и поэтому вынесена в отдельный объект который может быть вызван в любом хендлере, путем DI конструктора
Далее еще хуже =) В логах имеется свой хендлер и своя цепочка событий.

Допустим мы делаем запись чего в блог, отправляем в хендлер нашу команду или что там может быть в laravel, где происходит обработка. В обработке может быть запись в БД а так же загрузка изображения.
Вот загрузку изображения, стоит выделить в отдельный сервис.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы