我有一个像/people/12/edit
这样的字符串的路由,我想将它与我的数据集中的路由进行比较。
在数据集中有以下路线:
我需要知道,我的路线/people/12/edit
会转到/people/:id/edit
的内部动作
所以我有以下条件来检查:
if(preg_match("/^".preg_replace('/:id/','([0-9]*)?',preg_replace('/\//','\/',$_route['route']))."$/", $route)){
// ...
}
但这似乎是一个糟糕的解决方案。我必须转义斜杠,我必须替换:id参数,然后我可以检查路由是否匹配。
但它看起来很糟糕并且有一个大问题。如果参数未命名为:id
,它会起作用。
你能给我一些提示或表现出更好的方法吗?
提前致谢
更新: 我没有使用任何mvc框架。它建立了自己的框架并学习任务"
存储在路线表上的路线:
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并返回(对于编辑链接)people#edit
。在此之后,我知道有一个资源PeoplesController
并调用edit
操作。
我知道php有很多很棒的mvc框架。但我希望获得更多经验,并将一些rails逻辑重建为php:)
答案 0 :(得分:1)
首先,我会将其拆分为一些,最好是以可重用的方式,首先说一个解析映射的函数。
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;
}
或者只使用生锈的可信任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位之后使用。
基本上你的regx现在是
\/people\/([0-9]+|new)\/... etc.
preg_quote将用于防止用户添加自己的正则表达式,并且无意中和其他方式搞乱你的。