【问题标题】:Phalcon Routing: Url not matching the route definitionPhalcon 路由:Url 与路由定义不匹配
【发布时间】:2019-07-26 06:41:46
【问题描述】:

我在 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 旨在让用户将产品保存到愿望清单。

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

谢谢

【问题讨论】:

  • 您正在创建相同的前缀 URL。唯一不同的是第 2 路和第 3 路的婴儿车

标签: phalcon phalcon-routing


【解决方案1】:

我建议这样做

$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
));

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2016-04-29
      • 2014-01-01
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多