Zend Framework - Как создать иерархию, не будучи модулем? - PullRequest
0 голосов
/ 01 февраля 2010

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

test.com / апи / отдых

test.com / апи / xmlprc

В настоящее время у меня есть сопоставление API для каталога модуля. Затем я настраиваю маршрут, чтобы сделать его маршрутом отдыха. test.com/api - это маршрут отдыха, но я бы предпочел, чтобы он был test.com/api/rest. Это позволило бы мне позже добавить другие.

В Bootstrap.php:

        $front = Zend_Controller_Front::getInstance();
  $router = $front->getRouter();
    $route = new Zend_Controller_Router_Route(
 'api/:module/:controller/:id/*',
 array('module' =>'default')

);

$ router-> addRoute ('api', $ route);

$ restRoute = new Zend_Rest_Route ($ front, array (), array ( 'остальное' )); $ router-> addRoute ('rest', $ restRoute);

return $ router;

В application.ini:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

Я знаю, что это будет связано с маршрутами, но иногда я нахожу, что документация Zend Framework немного сложна для отслеживания.

Когда я захожу на test.com/rest/controller/, он работает так, как должен, но если я захожу на test.com/api/rest/, он говорит, что мой модуль - api, а контроллер - rest.

Ответы [ 2 ]

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

Возможно, вы захотите сделать что-то вроде api /: controller /: action.json или api /: controller /: action.xml (я видел множество API, например, Twitter).

Для этого вы можете сделать что-то вроде этого:

$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter(); // returns a rewrite router by default
$router->addRoute(
            'json_request',
            new Zend_Controller_Router_Route_Regex(
                                            '([^-]*)/([^-]*)/([^-]*)\.json', 
                                            array(
                                                'controller'   => 'index',
                                                'action'       => 'index',
                                                'request_type' => 'json'),
                                            array(
                                                1 => 'module',
                                                2 => 'controller',
                                                3 => 'action'
                                            )
        ));

Затем просто проверьте ваш параметр "тип запроса" и обработайте запрос в зависимости от того, что у вас есть. Вы должны изменить свой макет, чтобы включить JSON или XML на основе вашего запроса также.

Вам также потребуется модуль API с этим.

Примечание. Позаботьтесь о том, чтобы начальная загрузка модуля была добавлена ​​ко ВСЕМ вашим модулям в настоящее время, чтобы этот маршрут выполнялся во всех модулях. В настоящее время я проверяю способ исправить это, поэтому не могу сказать вам, как это сделать.

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

0 голосов
/ 01 февраля 2010

Ваша оригинальная линия была такой.

$restRoute = new Zend_Rest_Route($front, array(), array( 'rest' ));

Чтобы включить Zend_Rest_Route для определенных контроллеров, добавьте массив имен контроллеров в качестве значения каждого элемента массива модуля.

$restRoute = new Zend_Rest_Route($front, array(), array( 'api' ) => array('rest'));

Также ссылка http://framework.zend.com/manual/en/zend.controller.router.html

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

...