Я создаю веб-сервис с zend, и я использую модули для разделения своих api-версий. Пример: «приложения / модули / v1 / контроллеры», «приложения / модули / v2 / контроллеры» имеют различный набор действий и функций.
Я сделал «v1» в качестве модуля по умолчанию в файле «application.ini»:
resources.modules = "" resources.frontController.defaultModule = "v1" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.moduleControllerDirectoryName = "controllers"
Я написал следующее в моем файле начальной загрузки:
$router = $front->getRouter(); $r1 = new Zend_Controller_Router_Route_Regex('api/v1/tags.xml', array('module' => 'v1', 'controller' => 'tags', 'action' => 'index')); $router->addRoute('route1', $r1);
Предположим, если это мой url: http://localhost/api/v1/tags.xml
то он относится к версии 1 (v1).
Но я не хочу писать много таких маршрутов, как этот, поэтому я хочу знать, как я могу отслеживать версию из urge regex и динамически определять версию api, которая будет использоваться (1 или 2).
попробуй использовать
$r1->addRoute( 'json_request', new Zend_Controller_Router_Route_Regex( '([^-]*)/([^-]*)/([^-]*)\.xml', array( 'controller' => 'index', 'action' => 'index', 'request_type' => 'xml'), array( 1 => 'module', 2 => 'controller', 3 => 'action' ) ));
Попробуй это:
$r1 = new Zend_Controller_Router_Route_Regex('api/(v.*)/tags.xml', array('module' => 'v1', 'controller' => 'tags', 'action' => 'index'), array(1 => 'module') );
Это автоматически перезапишет параметр модуля и, следовательно, автоматически переместится в правый модуль. Не нужно больше использовать плагин с методом preDispatch
.
До сих пор я пробовал вот так:
$r1 = new Zend_Controller_Router_Route_Regex('api/v(.*)/tags.xml', array('module' => 'v1', 'controller' => 'tags', 'action' => 'index'), array(1 => 'version') ); $router->addRoute('route1', $r1);
И я мог бы получить отсюда идею:
Итак, теперь я использовал фронт-контроллер и метод preDispatch, я устанавливаю имя модуля на основе значения, которое я получаю в значении параметра «версия», например
if($request->getParam('version') == 2 { $request->setModuleName('v2') }
Но после изменения версии в url до v2 она все равно переходит к действию контроллера в модуле v1.