0

我在 Phalcon 中定义了以下路线:

$router->add('/products', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index'
));

$router->add('/products/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index',
    'params' => 1
));

$router->add('/products/:action', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1
));


$router->add('/products/:action/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1,
    'params' => 2
));

我有以下格式的网址

http://www.example.com/products/3029-baggrys-oats-2-kg-pack
=> 产品详情页面,这里“3029-baggrys-oats-2-kg-pack”是一个参数

http://www.example.com/products/save-to-wish-list => 这里“save-to-wish-list”是对控制器的操作

问题 第一个 url 旨在链接到产品详细信息页面,第二个 url 旨在让用户将产品保存到愿望清单。

但两个网址都匹配第三条路线。我知道我在定义路线时一定做错了什么。谁能指出解决这种情况的更好方法是什么?

谢谢

4

2 回答 2

0

我建议这样做

$router->add('/products', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index'
));

$router->add('/products/params/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index',
    'params' => 1
));

$router->add('/products/action/:action', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1
));


$router->add('/products/:action/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1,
    'params' => 2
));

或者您可以更改方法类型,例如 GET、POST、PUT、DELETE

$router->addGet('/products', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index'
));

$router->addPost('/products/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 'index',
    'params' => 1
));

$router->addPut('/products/:action', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1
));


$router->addDelete('/products/:action/:params', array(
    'module' => 'products',
    'namespace'=>'MyNameSpace\Products\Controllers\\',
    'controller'=>'index',
    'action' => 1,
    'params' => 2
));
于 2019-07-26T06:47:14.907 回答
0

:params是映射到此正则表达式的快捷方式:(/.*)* 它完全是可选的。我猜你也有你的应用程序设置为自动添加斜杠?

问题是,没有捷径,甚至没有正则表达式,可以区分“3029-baggrys-oats-2-kg-pack”作为参数和“save-to-wish-list”作为操作之间的区别。

由于保存到愿望清单是一个临时 URL - 大概用户会被带到这个 URL,你的控制器会做一些事情,然后将它们重定向到 - 我建议你将该 URL 更改为其他内容,例如/wishlist/save. 这将简化您的控制器,并且您不需要自定义路由。

于 2019-07-31T20:44:14.807 回答