Codeigniter复杂通配符路由

时间:2015-10-28 05:38:18

标签: php codeigniter

嗨,伙计们,我正在努力实现一些我希望可能但却无法找到正确方法的东西。 我正在使用codeigniter 2.2.0 我想在codeigniter中使用url,如

domain/username/controller/method/$args

让我解释当用户输入类似

的网址时
domain/mike/job/editJob/12/urgent/

Here "mike" is someone's user name 
"job" will be a controller alias 
"editJob" will be a method 
"12" and "urgent" will be parameter of editJob method. 
editJob method will have three parameters. 
I want "mike" as 1st parameter, 
then "12" and "urgent" as second and third parameter.

到目前为止,我在路线中所做的一切

$route['(:any)/job/(:any)'] = 'job_c/$2/$1';

当我输入网址时

domain/mike/job/editJob/12/urgent

在Job controller中我得到了

"12" as first parameter
"urgent" as second parameter
and "mike" as third parameter

** 有没有办法让“迈克”作为第一个参数,然后其余的就可以了**

  

编辑:   如果我在方法之后传递三个参数,那么我还没有   获取用户名!!

我需要将用户名作为第一个参数,因为在任何方法中都可能有多个参数,并且也有可能有条件参数。

我还想知道一件事。是否可以使这样的路由与我给定的路由相同但控制器别名也是通配符。或者,如果有任何方法可以检查url中的段是否为控制器,那么一条路由,如果不是控制器,则应该发生其他事情。

我不是一个很好的描述者仍然试图保持简单。如果有人知道一些对我有帮助的事情。

由于

更新 有没有办法在routes.php文件的会话中保留用户名“mike”,因此我不必将其作为参数传递。

再次更新 我以某种方式解决了这个问题。 我正在使用

$route['(:any)/garage/([^/]*)/([^/]*)/(.*)'] = '$2/$3/$1/$4';

这里的车库只不过是路线的简单标识符。当它将车库作为url中的第二段时,此路由将起作用。它会像

一样工作
  

域/用户/车库/ anyControler / anyMethod / manyParameters

它完全是动态的,只有车库用作标识符。如果需要,可以使用控制器名称而不是使用任何标识符。那么你不必为多个控制器多次声明相同的事情,但它会正常工作。它适用于任何控制器和任何方法。此外,它还支持动态数量的参数。 我不知道是否有更好的方法可以做到这一点,但它解决了我的问题。如果有人知道更好的事情那么请分享。

1 个答案:

答案 0 :(得分:1)

我认为正在发生的事情是你正在访问

  

域/麦克风/工作/ editJob / 12 /紧急

并将其解析为: job_c / editJob / 12 /紧急/麦克

由于:

$route['(:any)/job/(:any)'] = 'job_c/$2/$1';

$ 2 =(:any)/ job / (:any) = editJob / 12 / urgent
$ 1 = (:任意) / job /(:any)=迈克

代: job_c / editJob / 12 /紧急/麦克

您可以尝试保持您的路线与当前路线类似:

 $route['(:any)/job/(:any)/(:any)'] = 'job_c/$2/$1/$3';

这将允许您将$ 2与任何方法名称匹配,并将$ 1作为第一个参数,将$ 3作为其余的params。

但是,我建议,如果这是一个非常具体的路由,用实际的方法名称和params的预期类型替换$ 2:any,否则,你可能会收到匹配控制器中每个方法的意外值。 我会使用类似的东西:

 $route['(:any)/job/editJob/(:num)/(:any)'] = 'job_c/editJob/$1/$2/$3';

希望这有帮助。

<强>更新 对于控制器匹配:Code Igniter使用表单controller / method / param1 / param2 /...

只要您按照该顺序创建与控制器,方法和参数匹配的路由,您就可以执行任何操作。

$route['(:any)/(:any)/(:any)'] = '$1/$2/$3';

或只是

$route['(:any)'] = '$1';

希望它包含一个控制器和方法以及所需的参数。

我认为这将完全忽略了拥有路由系统的重点。