匹配路线的优雅方式

时间:2015-07-08 03:53:04

标签: php regex refactoring

我坚持使用一段看起来很糟糕的代码。

我有一个像/people/12/edit这样的字符串的路由,我想将它与我的数据集中的路由进行比较。 在数据集中有以下路线:

  • / people
  • / people /:id
  • / people / new
  • /人/:ID /编辑

我需要知道,我的路线/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:)

1 个答案:

答案 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将用于防止用户添加自己的正则表达式,并且无意中和其他方式搞乱你的。