一种匹配路线的优雅方式
an elegant way to matching a route
我卡在了一段看起来很糟糕的代码上。
我得到了一条像 /people/12/edit
这样的字符串形式的路线,我想将它与我的数据集中的路线进行比较。
在数据集中有这样的路线:
- /人
- /人/:id
- /people/new
- /人/:id/edit
我需要知道,我的路线 /people/12/edit
进入了 /people/:id/edit
的内部行动
所以我有以下条件来检查这个:
if(preg_match("/^".preg_replace('/:id/','([0-9]*)?',preg_replace('/\//','\/',$_route['route']))."$/", $route)){
// ...
}
但这似乎是一个糟糕的解决方案。我必须转义斜杠,我必须替换 :id 参数,然后,我可以检查路由是否匹配。
但它看起来很糟糕并且有一个大问题。如果参数未命名 :id
,它就不会工作。
你能给我一些提示或展示更好的方法吗?
提前致谢
更新:
我没有使用任何 mvc 框架。这是一个 "build your own framework and learn task"
路线中存储的路线 table:
people_index get /people people#index
people_show get /people/:id people#show
people_edit get /people/:id/edit people#edit
people_update put /people/:id people#update
people_new get /people/new people#new
people_create post /people people#create
people_delete delete /people/:id people#delete
如果我调用 link_to 'people_index'
,它将显示 /people
。上面的条件是路由解析器的一部分。它只是在寻找正确的 uri 和 return(用于编辑 link)people#edit
。在此之后,我知道有一个资源 PeoplesController
并调用 edit
操作。
我知道 php 有很多很棒的 mvc 框架。但我想获得更多经验并将一些 rails 逻辑重建为 php :)
首先我会把它分成一些,最好以可重用的方式,说一个函数来首先解析映射。
function createpattern( $map ) {
$map = preg_replace('/:id/', '([0-9]+|new)', $map );
//add other mappings here for example.
$map = preg_replace('/:name/', '([a-z])', $map );
return $map;
}
或者这部分只使用 rusty trusty str_replace。
function createpattern( $map ) {
$search = array( ':id', ':name' );
$replace = array( '([0-9]+|new)', '([a-z]+)?');
$map = preg_quote($map); //maybe use it here.
$map = str_replace($search, $replace, $map );
return $map;
}
所以这个
/people/:id
变成
/people/([0-9]+|new)
你应该在某个地方使用 preg_quote,但在添加 regx 位之后就不行了。
基本上你的正则表达式现在是
\/people\/([0-9]+|new)\/... etc.
preg_quote 将用于防止用户添加自己的正则表达式并弄乱你的正则表达式,无论是无意还是其他。
我卡在了一段看起来很糟糕的代码上。
我得到了一条像 /people/12/edit
这样的字符串形式的路线,我想将它与我的数据集中的路线进行比较。
在数据集中有这样的路线:
- /人
- /人/:id
- /people/new
- /人/:id/edit
我需要知道,我的路线 /people/12/edit
进入了 /people/:id/edit
所以我有以下条件来检查这个:
if(preg_match("/^".preg_replace('/:id/','([0-9]*)?',preg_replace('/\//','\/',$_route['route']))."$/", $route)){
// ...
}
但这似乎是一个糟糕的解决方案。我必须转义斜杠,我必须替换 :id 参数,然后,我可以检查路由是否匹配。
但它看起来很糟糕并且有一个大问题。如果参数未命名 :id
,它就不会工作。
你能给我一些提示或展示更好的方法吗?
提前致谢
更新: 我没有使用任何 mvc 框架。这是一个 "build your own framework and learn task"
路线中存储的路线 table:
people_index get /people people#index
people_show get /people/:id people#show
people_edit get /people/:id/edit people#edit
people_update put /people/:id people#update
people_new get /people/new people#new
people_create post /people people#create
people_delete delete /people/:id people#delete
如果我调用 link_to 'people_index'
,它将显示 /people
。上面的条件是路由解析器的一部分。它只是在寻找正确的 uri 和 return(用于编辑 link)people#edit
。在此之后,我知道有一个资源 PeoplesController
并调用 edit
操作。
我知道 php 有很多很棒的 mvc 框架。但我想获得更多经验并将一些 rails 逻辑重建为 php :)
首先我会把它分成一些,最好以可重用的方式,说一个函数来首先解析映射。
function createpattern( $map ) {
$map = preg_replace('/:id/', '([0-9]+|new)', $map );
//add other mappings here for example.
$map = preg_replace('/:name/', '([a-z])', $map );
return $map;
}
或者这部分只使用 rusty trusty str_replace。
function createpattern( $map ) {
$search = array( ':id', ':name' );
$replace = array( '([0-9]+|new)', '([a-z]+)?');
$map = preg_quote($map); //maybe use it here.
$map = str_replace($search, $replace, $map );
return $map;
}
所以这个
/people/:id
变成
/people/([0-9]+|new)
你应该在某个地方使用 preg_quote,但在添加 regx 位之后就不行了。
基本上你的正则表达式现在是
\/people\/([0-9]+|new)\/... etc.
preg_quote 将用于防止用户添加自己的正则表达式并弄乱你的正则表达式,无论是无意还是其他。