Symfony 4, где удалить большую часть из действия контроллера - PullRequest
0 голосов
/ 29 мая 2018

Я использую Symfony 4 и хочу удалить большую часть из действия контроллера в другой метод.Но в этой части используются данные из Request объекта и возврата Response объекта.

У меня есть 2 варианта для перемещения этой части:

  1. Переход к частному методу в контроллере.
  2. Перемещение в метод обслуживания.

И у меня есть 2 варианта, что делать с параметрами метода:

  1. Установить Request объект в качестве аргумента метода иполучить все данные из него в методе.
  2. Получить все данные из Request объекта в действии контроллера и установить его в качестве аргументов метода.

Какой способ лучше и почему?Может быть, есть лучший способ?

Является ли нормальной практикой возвращать Response объект в действие контроллера из метода обслуживания?

Пример кода:

public function index(Request $request): Response
{
    if(!$this->hasSuccessAuth($request)) {
        return $this->authenticateClient();
    }

}

private function hasSuccessAuth(Request $request): bool
{
    $passwordCookie = $request->cookies->get('secret', NULL);

    if(self::CHECK_AUTH_MODE === $request->query->get('mode') and
        $this->authService->isCorrectPasswordCookie($passwordCookie)) {

        return true;
    }

    return false;
}

private function authenticateClient(): Response
{
    if($this->authService->isSuccessHttpAuth()) {

        $passwordForCookie = $this->authService->getPassword();

        return new Response("success\nsecret\n".$passwordForCookie."\n");
    }

    return new Response('', Response::HTTP_FORBIDDEN);
}

1 Ответ

0 голосов
/ 30 мая 2018

У меня есть 2 варианта для перемещения этой части:

  1. Переход к частному методу в контроллере.
  2. Переход к методу обслуживания.

Фактически вы можете перейти в приватный метод в контроллере или в сервисный метод.Если вы перейдете к приватному методу в контроллере, мои советы таковы, что вы должны создать класс контроллера-обертки, который расширит ваш контроллер, и вы поместите этот приватный метод внутрь.Очевидно, этот контроллер будет расширять базовый контроллер Symfony, если ваш первоначальный контроллер уже расширил его.Это может быть хорошо, если вы намереваетесь использовать hasSuccessAuth и authenticateClient только с другими классами контроллеров.Потому что, если вы поместите эту логику в службу, другие службы или команды смогут использовать ее.Это зависит от вас.

Если теперь вы хотите, чтобы эта логика была доступна везде в вашем приложении, лучше создайте службу.Но вы должны спросить себя, будет ли эта новая служба иметь свои собственные данные или получит выгоду от внедрения зависимости.Если да, то создание сервиса - хорошая идея.Если нет, это означает, что вы будете использовать эту логику только для обработки данных, заданных в качестве параметров, и для возврата результата.В этом случае вы должны создать вспомогательный класс со статическими методами.

И у меня есть 2 варианта, что делать с параметрами метода:

  1. Установить объект запроса в качестве аргумента методаи получить все данные из него в методе.
  2. Получить все данные из объекта Request в действии контроллера и установить его в качестве аргументов метода.

Это зависит от вас, но еслиэто было мое приложение, я бы выбрал весь объект Request в качестве аргумента метода и все данные из него внутри метода.

И последнее: ваш метод authenticateClient не использует объект Request .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...