Zend Framework - Пользовательские маршруты, переопределенные при добавлении Zend_Rest_Route
Я создаю приложение, которое предоставляет RESTful API в модуле под названием api
, Для других модулей я создал небольшой класс, который возвращает Zend_Controller_Router_Rewrite
объект с заданными пользователем маршрутами:
$router = new Zend_Controller_Router_Rewrite();
foreach ($this->_modules as $module) {
if ($module === 'api') continue;
foreach ($this->_getConfigFiles($module) as $filename) {
$config = new Zend_Config_Ini($filename, 'routes');
$router->addConfig($config, 'routes');
}
}
return $router;
Для модуля по умолчанию у меня есть следующий маршрут:
[routes]
routes.default_index_index.type = Zend_Controller_Router_Route
routes.default_index_index.route = /
routes.default_index_index.defaults.module = default
routes.default_index_index.defaults.controller = index
routes.default_index_index.defaults.action = index
Теперь по моему Bootstrap
файл файл у меня следующий:
$router = Shark_Module_Loader::getInstance()->getRouter();
$frontController->setRouter($router);
$frontController->getRouter()->removeDefaultRoutes();
$apiRoute = new Zend_Rest_Route($frontController, array(), array('api'));
$router->addRoute('rest', $apiRoute);
Если я пропущу добавление маршрута отдыха, то все будет нормально для модуля по умолчанию, конечно. Но когда я добавляю маршрут RESTful, маршруты, определенные в маршрутизаторе, переопределяются (?), Поэтому текущий маршрут в index
действие index
контролер default
модуль ($this->getFrontController()->getRouter()->getCurrentRoute();
) является экземпляром Zend_Rest_Route. Таким образом, при попытке доступа к пользовательскому маршруту, определенному в одном из файлов конфигурации маршрута, скажем:
...
routes.default_pages_view.type = Zend_Controller_Router_Route
routes.default_pages_view.route = /view/:page
routes.default_pages_view.defaults.module = default
routes.default_pages_view.defaults.controller = pages
routes.default_pages_view.defaults.action = view
...
Я получаю сообщение об ошибке 404 о том, что запрос на действие (get
) нет.
Я уже просмотрел документы и не увидел ни одного намека на такое поведение.
Любая помощь и рекомендации будут оценены.
1 ответ
Нет способа сделать это из коробки. (Проверьте этот вопрос)
Вам нужно продлить Zend_Controller_Router_Route
учебный класс. Я сделал это так:
class Mauro_Controller_Router_Route_Method extends Zend_Controller_Router_Route {
protected $_method;
public function __construct($route, $defaults = array(), $reqs = array(), Zend_Translate $translator = null, $locale = null) {
list($this->_method, $route) = explode(' ', $route, 2);
parent::__construct($route, $defaults, $reqs, $translator, $locale);
}
public function match($path, $partial = false) {
$requestMethod = $this->getRequest()->getMethod();
$requestMethod = $this->getRequest()->getParam('method')
? strtoupper($this->getRequest()->getParam('method'))
: $requestMethod;
return $requestMethod == strtoupper($this->_method)
? parent::match($path, $partial)
: false;
}
protected function getRequest() {
return Zend_Controller_Front::getInstance()->getRequest();
}
}
Затем вы можете использовать его так:
$router->addRoute( new Mauro_Controller_Router_Route_Method( 'GET /view/:page', array( 'controller' => 'pages', 'action' => 'view' ), array( 'page' => '/d+', ) ) );