【问题标题】:Codeigniter complex wildcard RoutingCodeigniter 复杂通配符路由
【发布时间】:2016-01-27 18:57:54
【问题描述】:

大家好,我正在努力实现一些我希望是可能的,但找不到正确的方法。 我正在使用 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

在作业控制器中我得到

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

** 有没有办法让“mike”作为第一个参数,然后剩下的就可以了**

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

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

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

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

谢谢

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

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

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

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

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

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

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

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

    域/mike/job/editJob/12/urgent

    其被解析如下: job_c/editJob/12/urgent/mike

    因为:

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

    $2 = (:any)/job/(:any) = editJob/12/urgent
    $1 = (:any)/job/(:any) = 麦克

    替换: job_c/editJob/12/urgent/mike

    您可以尝试使您的路线与当前路线相似:

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

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

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

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

    希望这会有所帮助。

    更新: 对于控制器匹配:Code Igniter 使用表单控制器/方法/param1/param2/...

    只要你创建的路由按顺序匹配控制器、方法和参数,你就可以做任何事情。

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

    或者只是

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

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

    我认为这完全失去了拥有路由系统的意义。

    【讨论】:

    • 感谢@lebobbi 的建议。我当然可以尝试任何固定的方法。但是我正在启动一个需要大量方法的大型应用程序。它需要为几乎所有方法创建路由。我只想为控制器创建路由,方法也将由路由和参数数量决定。不管怎样,谢谢哥们
    • 嘿,@SaidurRahman,你仍然可以像以前一样使用它,$route['(:any)/job/(:any)/(:any)'] = 'job_c/$2 /$1/$3';唯一的区别是,方法部分将被分开,因此 $3 实际上将替换任何参数列表,而 $2 将替换控制器中的任何方法名称。您仍然可以将用户名放在其他参数之前。
    • 我试过 $route['(:any)/job/(:any)/(:any)'] = 'job_c/$2/$1/$3';这将用户名作为第二个参数:( $2 被视为很好的方法,但它将参数与用户名混合在一起。
    • 如何在控制器中获得 1 美元?
    猜你喜欢
    • 2017-05-18
    • 2013-11-11
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2017-07-17
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多