Правильная структура кода при предоставлении доступа к REST API с помощью Zend_Rest_Controller

Я новичок в Zend Frameworks и программировании типа MVC (хотя и не в PHP), и я пытаюсь предоставить API-доступ к данным на моем сервере с помощью Zend Framework.

Я использую статью Криса Дэниелсона (http://www.chrisdanielson.com/2009/09/02/creating-a-php-rest-api-using-the-zend-framework/) в качестве основы.

Я хочу предоставить доступ к данным в следующих форматах:

(a) http://www.example.com/api/createevent      
    Data will be POSTed here, success will return an id, otherwise an 
    error message/code

(b) http://www.example.com/api/geteventdetails/1234     
    GET request will return data

(c) http://www.example.com/api/getregistrationdetails/1234  
    GET request will return data

(d) http://www.example.com/api/getregistrationdetails/1234/567  
    GET request will return data

Вопросы:

  1. Существует файл по умолчанию, расположенный по адресу \api\application\controllers\VersionController.php, который позволяет обрабатывать URL-адреса типа: http://www.example.com/api/version . Должен ли я создавать отдельный файл, расположенный по адресу: \api\application\controllers\GeteventdetailsController.php, который обрабатывает запросы типа (b) (и по одному для каждого типа запроса)? Если нет, то где я должен разместить свой код для обработки этих нескольких типов запросов?

  2. Как я могу получить параметры, переданные в (b) в (d)?

  3. Чтобы выполнять запросы (b)–(d), мне нужно получить информацию из базы данных моего сервера. Где я должен разместить код, который выполняет фактический запрос MySQL?


person siliconpi    schedule 16.03.2011    source источник


Ответы (1)


Я много использовал маршруты в ZF, но не в реализации Rest, изучив документы и учебник, на который вы ссылались, - я сделаю все возможное, чтобы помочь вам...

Возможно, стоит посмотреть документацию для Rest router ( примерно 1/3 страницы вниз) — там поясняется, что он автоматически создаст для вас маршруты на основе метода запроса; поэтому ваш формат именования createevent, geteventdetails и т. д. не нужен.

Вопрос 1.

Вместо создания файла

\api\application\controllers\GeteventdetailsController.php

я бы создал файл

\api\application\controllers\EventsController.php

Это будет один контроллер для обработки всех действий событий, будь то получение, отправка, размещение и т. д. Ваше предложение слишком специфично для контроллера, поскольку получение, размещение и т. д. будут обрабатываться на уровне действия.

Вопрос 2.

Маршруты, описанные в документах, показывают, что конечный параметр (:id) будет назначен параметру в контроллере с именем id.

Таким образом, доступ к URL-адресу /events/ с помощью GET вызовет indexAction() в вашем EventsController.php файле.

А доступ к URL-адресу /events/99/ с помощью GET вызовет getAction() в вашем файле EventsController.php. Вы можете получить доступ к этому идентификатору из контроллера, как это

$id = $this->getRequest()->getParam("id");

OR

$id = $this->getRequest()->id;

Затем вы должны написать код для запроса к базе данных списка событий или определенного идентификатора. Что приятно подводит нас к...

Вопрос 3.

Вместо того, чтобы помещать код для запроса событий к базе данных в контроллер, вы должны создать модели для таблиц и строк базы данных. Я рекомендую использовать существующую настройку в ZF для Zend_Db_Row и Zend_Tb_Table. Это гарантирует, что ваше приложение/веб-сайт является MVC.

Размещение кода внутри контроллера может помешать дальнейшей разработке, например, когда вы позже будете писать регистрационную форму для события в другом контроллере. Логика создания события будет продублирована один раз в новом контроллере и один раз в контроллере Rest. Вам лучше централизовать эту логику в модели для манипулирования событиями и запросов к ним.

Надеюсь, это поможет!

person Jake N    schedule 16.03.2011
comment
Спасибо! Это многое проясняет. Я все еще немного озадачен тем, как обрабатывать разные запросы в одном контроллере, чтобы обрабатывать такие запросы, как example.com/api/geteventdetails/1234 и example.com/api/getregistrationdetails /1234 все вместе... Пока я решил использовать разные контроллеры, а позже при необходимости модернизирую их. - person siliconpi; 18.03.2011