Codeigniter复杂通配符路由


Codeigniter complex wildcard Routing

大家好,我正在努力实现一些我希望可能实现的事情,但却找不到正确的方法。我正在使用codeigniter 2.2.0我想在类似的代码点火器中使用url

domain/username/controller/method/$args

让我解释一下当用户键入类似的url时

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';

当我输入url 时

domain/mike/job/editJob/12/urgent

在作业控制器中,我得到

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

**有没有可能的方法让"mike"作为第一个参数,然后剩下的就可以了**

编辑时间:还有一件事,如果我在方法之后传递了三个参数,那么我就不是获取用户名!!

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

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

我不是一个善于描述的人,但还是尽量保持简单。如果有人知道一些对我有很大帮助的事情。

感谢

更新有没有任何方法可以将routes.php文件中的用户名"mike"保留在会话中,这样我就不必将其作为参数传递了。

再次更新我不知怎么解决了这个问题。我正在使用

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

在这里,车库只是一个简单的路线标识符。当它将车库作为url中的第二个分段时,这条路线将起作用。它将像一样工作

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

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

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

domain/mike/job/editJob/12/紧急

并且它被解析为:job_c/editJob/12/紧急/mike

因为:

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

$2=(:任意)/job/(:任何)=editJob/12/紧急
$1=(:任意)/job/(:任意

替换:job_c/editJob/12/紧急/mike

你可以试着保持你的路线与你现在的路线相似:

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

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

但是,我建议,如果这是一个非常具体的路由,用实际的方法名称和预期的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';

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

我认为这将完全失去一个路由系统的意义。