@superkolya

DRY в экшенах контроллера?

Допустим у нас есть 2 очень похожих по содержанию экшена контроллера, разница только в названии view. Каким образом принято в mvc фреймворках выносить общий код? Есть ли такие понятия, типа ControllerHelpers или подобное? Или же просто выделать Namespace типа
HTTP -> Controllers
HTTP -> ControllerHelpers
И каждый класс хелпера - это просто класс, который содержит в себе методы, которые мы потом вызываем в контроллере?

Например такой метод:
public function ololoAction()
{
        $form_data = $this->request->getJsonRawBody(true);

        (new OloloValidation())->assert($form_data);

        $id_variable = 'policy_id';
        $token_variable = 'object_token';
        $per_page_variable = 'per_page';

        $query_string = (new JuridicalDmsStructures('alias', [$id_variable => 'Long!', $token_variable => 'String!', $per_page_variable => 'Long!']))
            ->addStructure($id_variable, $token_variable, false, $per_page_variable)
            ->build();

        $query = [
            'query' => $query_string,
            'variables' => [
                $id_variable => $policy_id,
                $token_variable => $object_token,
                $per_page_variable => 1
            ]
        ];

        $result = (new Request())->post('', soglasie_gql_request_options(), $query);

        $contract_data = Fractal::create()
            ->item($result['data']['data']['policy'],  OloloTransformer::class)
            ->serializeWith(WithoutDataKeySerializer::class)
            ->toArray();

        if(!isset($contract_data['manager']['work_email'])){
            throw new UserableException($this->t->_('mailer.failed_to_get_manager_email'));
        }

        // Отправляем на почту
        /** @var \Phalcon\Mailer\Manager $mailer */
        $mailer = $this->di->getShared('mailer');

        $mail = $mailer->createMessageFromView(
                'view_path',
                ['form_data' => $form_data, 'contract_data' => $contract_data]
            )
            ->to($contract_data['manager']['work_email'])
            ->subject($this->t->_('mailer.juridical_dms_add_insured_theme'));

        $count = $mail->send();

        $this->logger->log(
            Logger::INFO,
            "Отправка письма\n"
            . "Текст письма: {content}\n"
            . "Email: {curator_email}\n"
            . "Кол-во отправленных писем: {status}\n",
            [
                'content' => $mail->getContent(),
                'curator_email' => $contract_data['manager']['work_email'],
                'status' => $count
            ]
        );

        if (!$count) {
            throw new UserableException($this->t->_('mailer.failed_to_send_email'));
        }
}

И, допустим, нужно сделать такой же экшен, только заменить путь до вьюхи письма view_path. Не копипастить же
  • Вопрос задан
  • 188 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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