我的应用程序路由非常奇怪,这是一个API。我没有使用micro,只是使用常规的Phalcon堆栈。
这是我的路由器定义:
$di->set('router', function () {
$router = new Router(false);
$router->setDefaultAction('index');
$router->setDefaultController('index');
$router->add('/:module/:controller/:params', array(
'module' => 1,
'controller' => 2,
'params' => 3
));
$router->removeExtraSlashes(true);
return $router;
});
路由器使用以下示例路径:
- /v1/用户/
- /v1/用户/1/
- /v1/users/1/permissions/
但由于某种原因,以下路线与任何路线都不匹配!
- /v1/
奇怪的是,我在玩路由定义,当我将add的第一个参数改为"/:module"(而不是"/:module/:controller/:params")时,路由器可以正常工作!
我束手无策,希望有人能帮我。我不知道自己做错了什么。不确定为什么一个路由定义会起作用,而另一个会失败。我是不是错过了什么?
注:
- 我没有setDefaultModule,因为我希望应用程序在模块丢失时抛出错误。我计划对应用程序进行版本控制,我认为这样可以正确处理丢失的模块。关于如何正确处理这件事,我真的找不到更好的答案了,所以我正在尽我所能
- 我使用的是完整的Phalcon应用程序,而不是micro,因为我想访问整个框架。只是一个架构决策
除了模块的现有路由外,您还可以添加仅通过模块名称访问的路由:作为
...
$router->add('/:module/:controller',
array(
'module' => 1,
'controller' => 2,
'action' => 'index',
)
);
$router->add('/:module',
array(
'module' => 1,
'controller' => 'index',
'action' => 'index',
)
);
...
如果您想对模块进行版本化并有一定的顺序,这是一种方法。
$router = new Router(false);
$versionedModules = ['a', 'b', 'c'];
foreach ($versionedModules as $module) {
$namespace = 'App\'. ucfirst($module) . 'Controllers';
$moduleRouter = new PhalconMvcRouterGroup([
'namespace' => $namespace,
'module' => $module
]);
$moduleRouter->add("/{$module}/:controller/:params/", [
'controller' => 1,
'params' => 2
]);
}
$router->mount($moduleRouter);