CodeIgniter:如何获取控制器,操作,URL信息


124

我有以下网址:

如何从这些URL获取控制器名称,动作名称。我是CodeIgniter新手。是否有任何辅助功能来获取此信息

例如:

$params = helper_function( current_url() )

哪里$params变得像

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)

Answers:


217

您可以使用URI类

$this->uri->segment(n); // n=1 for controller, n=2 for method, etc

有人告诉我以下工作,但是目前无法测试:

$this->router->fetch_class();
$this->router->fetch_method();

因为我的控制器有子文件夹,所以$ this-> uri-> segment(1)返回的控制器名称可能不正确。感谢您的帮助,我使用$ this-> router来获取信息。
noname.cs,2010年

2
为了正确获取目录,您还可以使用:$ this-> router-> fetch_directory();
jmserra

6
嘿,如果您使用的是Codeigniter 3,则对于Controller使用:$ this-> router-> class; 对于方法:$ this-> router-> method; 对于目录:$ this-> router-> directory; 文档:codeigniter.com/user_guide/installation/...
cartalot

$ this-> router-> fetch_class(); $ this-> router-> fetch_method(); 有用。
Dinesh Patra

133

而不是使用URI段,您应该这样做:

$this->router->fetch_class(); // class = controller
$this->router->fetch_method();

这样一来,即使您位于路由URL的后面,子域等中,您也知道始终使用正确的值。


我刚刚发现,使用此方法,当调用像这样的视图时,您将无法获得正确的类方法名称modules::run('module/controller/action')。它仅显示已加载页面的路由器信息。有什么办法可以克服这个问题?
Starx 2012年

太棒了!关于此安全性有何说法?即可以欺骗吗?
HellaMad 2013年

这应该是公认的答案-或使用快捷方式:$ this-> router-> class
ChristoKiwi

1
如果您在routes.php中更改了路由,则不会,$this->router返回返回代码运行的类,但不会返回被替代覆盖的实际路由器。根据您想做什么,两个答案都非常有用。
Tibor Szasz

这些方法已被描述,使用$this->router->class$this->router->method代替
理查德(Richard)

30

该方法已弃用。

$this->router->fetch_class();
$this->router->fetch_method();

您可以改为访问属性。

$this->router->class;
$this->router->method;

请参阅Codeigniter用户指南

URI路由方法fetch_directory(),fetch_class(),fetch_method()

有了属性CI_Router::$directoryCI_Router::$class并且CI_Router::$method成为公共属性,并且 它们各自fetch_*()不再为返回属性做任何其他事情-保留它们没有任何意义。

这些都是内部的,未记录的方法,但是为了避免向后兼容,以防万一,我们现在选择不推荐使用它们。如果您中的某些人已经利用它们,那么现在您可以访问属性:

$this->router->directory;
$this->router->class;
$this->router->method;


11

作为补充

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component

fetch_module()在CI 2.1.2中,此呼叫对我不起作用。在/system/router.php文件中找不到它。
蒂姆·彼得森2013年

1
@timpeterson,如答案所述,它仅在HMVC组件中可用。
Starx 2013年

谢谢,您救了我
Barbz_YHOOL

7

更新资料

答案是在2015年添加的,现在不推荐使用以下方法

$this->router->fetch_class();  in favour of  $this->router->class; 
$this->router->fetch_method(); in favour of  $this->router->method;

嗨,您应该使用以下方法

$this->router->fetch_class(); // class = controller
$this->router->fetch_method(); // action

为此目的,但要使用此功能,您需要从扩展钩子,CI_Controller并且它就像一个吊饰一样工作,您不应该使用uri段


3

如果使用$ this-> uri-> segment,则如果URL重写规则发生更改,则段名称匹配将丢失。


3

在班级或库中的任何地方使用此代码

    $current_url =& get_instance(); //  get a reference to CodeIgniter
    $current_url->router->fetch_class(); // for Class name or controller
    $current_url->router->fetch_method(); // for method name

1

URL的最后一段将始终是操作。请得到这样的:

$this->uri->segment('last_segment');

-1
$this->router->fetch_class(); 

// fecth类控制器$ this-> router-> fetch_method();中的类

// 方法


-4

控制器类不起作用。

所以我建议您使用以下脚本

global $argv;

if(is_array($argv)){
    $action = $argv[1];
    $method = $argv[2];
}else{
    $request_uri = $_SERVER['REQUEST_URI'];
    $pattern = "/.*?\/index\.php\/(.*?)\/(.*?)$/";
    preg_match($pattern, $request_uri, $params);
    $action = $params[1];
    $method = $params[2];
}

有可用的预定义函数,例如$ this-> router-> fetch_class()和fetch_method(),因此我们不需要手动进行。
Naveed Ramzan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.