2015-11-16 2 views
0

У меня есть приложение на основе symfony2, которое в основном предоставляет API REST. Приложение не имеет никакого пользовательского интерфейса.symfony2: доступ к REST api из команды

В том же приложении есть несколько команд, которые создаются для управления ресурсами. Как создание пользователя, переадресация пароля пользователя, удаление пользователя, назначение пользователя определенной группе и т. Д.

Теперь я хочу, чтобы классы команд использовали API REST (они не что иное, как действия контроллера) для выполнения фактического операции, поскольку этот REST API, которые уже оснащены логиками проверки или другой необходимой бизнес-логикой и т.д.

Вопрос: Что является лучшим вариантом для использования в REST API-интерфейсах (аки действия контроллера) из классов Command? Я могу думать о двух подходах.

  1. Создание объекта запроса внутри командного класса. Установка правильного содержимого запроса, заголовка и т. Д. Включите класс контроллера и вызовите действие контроллера статически с созданным объектом запроса.

  2. Используйте curl, чтобы сделать http-звонки с правильным содержанием и заголовками.

Среди этих двух подходов выше, первый кажется мне более понятным, однако, похоже, что для этого требуется более элегантный способ. Любое предложение?

ответ

1

Подход curl позволяет полностью отключить приложение api от ваших команд. Вы даже можете использовать свою команду на сервере разработки для своего производственного приложения. Это на самом деле довольно чистый подход и косвенно помогает проверить ваш api. Кстати, если вы в конечном итоге используете завиток, тогда сторонняя библиотека, такая как жужжание, может сделать жизнь намного проще.

Вызов действий контроллера напрямую может быть неудобным. Как вы указали, вам нужно будет подделать объект запроса, заполнить его (предполагается) из аргументов командной строки, создать экземпляр контроллера, вызвать действие и получить ответ, а затем распаковать ответ, чтобы узнать, что произошло. Просто много «вещей». И, конечно же, он «очень хорошо» сочетает ваш командный код с кодом рамки контроллера.

Что мне нравится делать, это переместить фактический «бизнес-код» в свои собственные службы, а затем внедрить службы в контроллеры. Затем действие контроллера становится очень тонким. Действие распаковывает аргументы из запроса, вызывает службы и затем передает результаты в ответ.

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

Для меня, по крайней мере, это приводит к более чистому дизайну. Сервисы легче тестировать, и, конечно же, легко разделить функциональность между контроллерами и командами.

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

+0

Спасибо за идею использования сервисного модуля. Я в основном делаю это для обучения, поэтому я могу определенно реорганизовать его в любой степени, в чем я нуждаюсь. Я вернусь с моими выводами. – Samiron

Смежные вопросы