Phalcon路线冲突

时间:2017-12-26 10:55:21

标签: php routes 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');

我为类别路由获取了unifined控制器,因为与default_module路由冲突。我该如何解决这个问题?

我有路线:/ category-name / 默认值:/ controller / action /...

与路线冲突。

1 个答案:

答案 0 :(得分:0)

阅读您的代码,我发现可以做出一些改进:

1)首先,你在这些正则表达式中不需要两个连字符。而不是[0-9\-a-z\-],而是[0-9a-z\-]

2)我看到有两个重复的category_view_cpu名称。确保在复制和粘贴后进行修改。 ;)

3)您的路线逻辑过于宽泛,从而导致模糊不清。例如,您对category_view_cpu路由(第一个)路由的路由定义和正则表达式的行为与default_module路由非常相似。因此,在第一个路径中,您期望使用字母数字小写字符串(带有可选连字符),并且在default_module路由中,您还希望仅包含字母的字符串至少包含3个字符。所以,如果我输入yoursite.com/dummydummy  part将匹配第一条路线和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的网址,它会将其与我制作的第一条路线相匹配。但是如果它获得了一条路线:/dummy,那么它将与第一条路线不匹配,但会匹配我的第二条路线。

路由组也非常适合帮助区分和分离路由逻辑。我建议你完全阅读,在这里:https://docs.phalconphp.com/en/3.2/routing#defining-groups-of-routes