Правильная маршрутизация для API отдыха с Zend - PullRequest
1 голос
/ 01 марта 2010

Я пытаюсь внедрить REST API для моего сайта.

Моя проблема в том, что мешает Zend-маршрутизация по умолчанию. Сначала я попытался использовать Zend_Rest_Route, но я не смог понять, как я должен был правильно использовать его для «глубоких» маршрутов, также известный как сайт / api / resource1 / filter / resource2 / id.

Используя стандартную Zend-маршрутизацию, мне нужно было бы создать гигантский Resource1Controller, чтобы позаботиться обо всех возможных действиях, и я не думаю, что это "хороший" способ сделать это.

Я попытался с помощью Resauce (http://github.com/mikekelly/Resauce/), создать модуль API и добавить маршруты, но я не могу заставить его работать правильно:

Шаблоны, которые я добавил, были:

    $this->addResauceRoutes(array(
        'api/resource' => 'resource',
        'api/resource/:id' => 'custom',
        'api/resource/filter' => 'resource-filter',
        'api/resource/filter/:id' => 'custom',
    ));

Что затем приводит к этому:

public function addResauceRoutes($routes) {
    $router = Zend_Controller_Front::getInstance()->getRouter();
    foreach ($routes as $pattern => $controller) {
        $router->addRoute($controller,
            new Zend_Controller_Router_Route($pattern, array(
                'module' => 'api',
                'controller' => $controller
                )
            )
        );
    }
    Zend_Controller_Front::getInstance()->setRouter($router);
  • веб-сайт / API / ресурс получает меня Resource1Controller, хорошо
  • website / api / resource / filter возвращает меня к resource1filterController, нормально
  • website / api / resource / filter /: id заставляет меня пользовательский контроллер, ок
  • Я бы хотел, чтобы сайт / api / resource /: id перевел меня на тот же пользовательский контроллер ... Но он перенаправляет меня на Resource1Controller.

Какое решение для меня правильно создать мой API? Есть ли хороший способ сделать это с Zend_Rest_Route?


Редактировать: Майк,

Я чувствовал, что для меня неуместно использовать разные контроллеры, так как мне нужны пути "website / api / resource /: id" и "website / api / resource / filter /: id", чтобы дать мне почти точную информацию тот же результат (с той лишь разницей, что, поскольку там есть фильтр, я могу получить сообщение с сообщением «контент отфильтрован»).

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

Однако я не хочу использовать базовую маршрутизацию Zend, так как для пути "website / api / resource / filter / resource2" я хотел бы иметь совершенно другой состав, поэтому я бы хотел использовать другой контроллер, тем более что я пытаюсь использовать Zend_Rest_Action и мне нужны мои контроллеры для использования основных действий getAction (), putAction (), postAction () и deleteAction ().

Ответы [ 2 ]

1 голос
/ 02 марта 2010

Не могли бы вы объяснить, почему вам нужны два шаблона URI, указывающих на один и тот же контроллер. Лучшим решением может быть использование отдельного контроллера для каждого из двух шаблонов и перемещение любой общей логики в вашу модель.

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


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

Лично я думаю, что было бы чётче перенести общую логику в модель и сделать ваши контроллеры более стройными. Для меня это не расточительно, а просто более организованно - со временем вам будет проще управлять вашим кодом.

Если вам действительно нужно использовать один и тот же контроллер, вы всегда можете использовать вместо него параметр запроса, который будет работать нормально:

api/resource/foo?filter=true

Об этом URI по первому маршруту ('api / resource /: id' => 'custom') будет позаботиться бесплатно.

Но, пожалуйста, рассмотрите возможность использования двух контроллеров, я думаю, что это лучший подход.

0 голосов
/ 01 марта 2010

Хорошо, причина, по которой я не получил хорошие контроллеры, заключалась в том, что Resauce использует имя контроллера в качестве имени маршрута, которое должно быть уникальным - поэтому второй URL, указывающий на «пользовательский» контроллер, не может работать. Теперь я могу получить нужные файлы:)

Так что вместо того, что было отмечено ранее, я использую непосредственно $ router-> addRoute (); и каждый раз определяйте новые имена, даже если они указывают на один и тот же контроллер.

Пример:

$router->addRoute('resource', new Zend_Controller_Router_Route('/api/resources/:id', array('module' => 'api', 'controller' => 'resource')));
$router->addRoute('resourceFiltered', new Zend_Controller_Router_Route('/api/resources/filter1/:id', array('module' => 'api', 'controller' => 'resource', 'filter' => 'filter1'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...