我正在创建一个供个人使用的简单路由系统。添加路线 像这样的东西:
Router::add('/news/?', [ 'controller' => 'NewsController', 'method' => 'index' ]);
// /news/17, /news/17/, /news/17/a-title-here
Router::add('/news/\d+/?[^/]*', [ 'controller' => 'NewsController', 'method' => 'show' ]);
Router::add('/news/\d+/edit/?', [ 'controller' => 'NewsController', 'method' => 'edit' ]);
Router::add('/news/\d+/delete/?', [ 'controller' => 'NewsController', 'method' => 'delete' ]);
问题在于,因为第二个规则允许在网址中使用可选标题, 如果“编辑”或“删除”在实际网址中没有尾部斜杠, 我的系统调用show()和编辑()或删除(),具体取决于内容 网址。因此,如果网址具有“编辑”或“删除”,则无论是否包含该网址 尾部斜杠,它应该只触发该方法,而不是show(),它应该 只有当网址包含“/ news /”或“/ news”之类的内容时才会被调用。
为了澄清一点,如果我有像“/ news / 17 / delete”这样的网址(没有尾随/),那么 调用show()和delete()。但是,如果网址看起来像“/ news / 17 / delete /”(带有 尾部斜杠),然后不调用show(),这是正确的。
这是Router类,以防它有用(我应该把它粘贴到这里,让我知道)。 https://github.com/FernandoBasso/phprouter/blob/master/helpers/class.Router.php
编辑:感谢所有帮助过的人。我从你所分享的所有想法中学到了很多东西,并且如果可能的话,我会接受所有这些想法。 :)答案 0 :(得分:0)
你有没有试过像:
Router::add('/news/\d+/?(?!/?(?:edit|delete))[^/]*$', [ 'controller' => 'NewsController', 'method' => 'show' ]);
答案 1 :(得分:0)
排除第二条规则匹配编辑或删除的可能性:
Router::add('/news/\d+/?(?!edit/?$|delete/?$)[^/]*', [ 'controller' => 'NewsController', 'method' => 'show' ]);
这应该有效,因为它将允许通过以下示例:
/news/12/foo
/news/12/foo-delete
/news/12/delete-foo
但不是:
/news/12/delete
/news/12/delete/
/news/12/edit
/news/12/edit/
答案 2 :(得分:0)
您应按顺序处理您的路线,从最具体到最通用,并在找到匹配后立即停止,例如:
Router::add('/news/\d+/edit/?', [ 'controller' => 'NewsController', 'method' => 'edit' ]);
Router::add('/news/\d+/delete/?', [ 'controller' => 'NewsController', 'method' => 'delete' ]);
Router::add('/news/\d+/?[^/]*', [ 'controller' => 'NewsController', 'method' => 'show' ]);
Router::add('/news/?', [ 'controller' => 'NewsController', 'method' => 'index' ]);
这样,当您循环浏览它们时,首先尝试匹配/news/:id/:action
路径。