Phalcon路线冲突
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Phalcon路线冲突相关的知识,希望对你有一定的参考价值。
我对phalcon的路线有问题。我有代码:
$router->add('/{aliascat:[0-9-a-z-]+}(/?)', array(
'module' => 'frontend',
'controller' => 'category',
'action' => 'view',
'category' => 1,
'lang' => 'md',
))->setName('category_view_cpu');
$router->add('/{lang:[' . $langsDefined . ']{2}+}/{aliascat:[0-9-a-z-]+}(/?)', array(
'module' => 'frontend',
'controller' => 'category',
'action' => 'view',
'category' => 2,
'lang' => 1,
))->setName('category_view_cpu');
$router->add('/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend',
'controller' => 1,
'action' => 'index',
'lang' => 'md',
))->setName('default_module');
$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend',
'controller' => 2,
'action' => 'index',
'lang' => 1,
))->setName('default_module_lang');
$router->add('/{controller:[a-z]{3,50}+}/:action/', array(
'module' => 'frontend',
'controller' => 1,
'action' => 2,
'lang' => 'md',
))->setName('default_module_controller_action');
$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}/:action/', array(
'module' => 'frontend',
'controller' => 2,
'action' => 3,
'lang' => 1,
))->setName('default_module_controller_action_lang');
$router->add('/{controller:[a-z]{3,50}+}/:action/:params/', array(
'module' => 'frontend',
'controller' => 1,
'action' => 2,
'params' => 3,
'lang' => 'md',
))->setName('default_module_controller_action_params');
$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}/:action/:params/', array(
'module' => 'frontend',
'controller' => 2,
'action' => 3,
'params' => 4,
'lang' => 1,
))->setName('default_module_controller_action_params_lang');
我为类别路由获取未定义的控制器,因为与默认模块路由冲突。我该如何解决这个问题?
我有路由:/ category-name /和默认:/ controller / action / ...
与路线冲突。
阅读您的代码,我发现可以做出一些改进:
1)首先,你在这些正则表达式中不需要两个连字符。而不是[0-9-a-z-]
,把[0-9a-z-]
。
2)我看到有两个重复的category_view_cpu
名字。确保在复制和粘贴后进行修改。 ;)
3)您的路线逻辑过于宽泛,从而导致模糊不清。例如,您对category_view_cpu
路由(第一个)的路由定义和正则表达式将与default_module
路由非常相似。因此,在第一个路径中,您需要一个字母数字小写字符串(带有可选连字符),而在default_module
路由中,您还需要一个至少包含3个字符的字母字符串。所以,如果我输入yoursite.com/dummy
,dummy
部分将匹配第一条路线和default_module
路线。 Phalcon没有办法知道dummy
是控制器还是类别别名。
我建议您不要通过使用路由组或为某些路由指定控制器来使路由如此宽泛,这些路由只能为任何给定的控制器处理。例如:
$router->add('/categories/{alias:[0-9a-z-]+}(/?)', array(
'module' => 'frontend',
'controller' => 'categories',
'action' => 'view',
'category' => 1,
'lang' => 'md',
))->setName('category_view_cpu');
然后,在此路由^下面,您可以定义将捕获所有其他请求的通用/默认路由。例:
$router->add('/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend',
'controller' => 1,
'action' => 'index',
'lang' => 'md',
))->setName('default_module');
这个例子会发生的是,如果Phalcon获得像/categories
这样的URL,它会将它与我制作的第一条路线相匹配。但如果它得到一条路线:/dummy
,那么它将与第一条路线不匹配,但会匹配我的第二条路线。
路由组也非常适合帮助区分和分离路由逻辑。我建议你完整阅读,在这里:https://docs.phalconphp.com/en/3.2/routing#defining-groups-of-routes
以上是关于Phalcon路线冲突的主要内容,如果未能解决你的问题,请参考以下文章
PHP 命名空间与 Phalcon、Vagrant、Apache2 的冲突
phalcon: Windows 下 Phalcon dev-tools 配置 和 Phpstorm中配置Phalcon 代码提示