CodeIgniter: How to get Controller, Action, URL information
Asked Answered
G

11

125

I have these URLs:

How to get controller name, action name from these URLs. I'm CodeIgniter newbie. Are there any helper function to get this info

Ex:

$params = helper_function( current_url() )

Where $params becomes something like

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)
Ginkgo answered 14/1, 2010 at 4:3 Comment(0)
P
227

You could use the URI Class:

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

I've also been told that the following work, but am currently unable to test:

$this->router->fetch_class();
$this->router->fetch_method();
Pavior answered 14/1, 2010 at 4:22 Comment(4)
because my controller have sub folder, so $this->uri->segment(1) return controller name maybe incorrect. Thanks for your help, I use $this->router to get the informations.Ginkgo
For getting the Directory Correctly you can also use: $this->router->fetch_directory();Disqualification
Hey if you are using Codeigniter 3, then for Controller use: $this->router->class; for Method: $this->router->method; for Directory: $this->router->directory; Documentation: codeigniter.com/user_guide/installation/…Synecious
$this->router->fetch_class(); $this->router->fetch_method(); it works.Ovular
M
137

Instead of using URI segments you should do this:

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

That way you know you are always using the correct values even if you are behind a routed URL, in a sub-domain, etc.

Masonmasonic answered 15/1, 2010 at 11:44 Comment(5)
I just found out, that using this method, you cannot get correct class method name when calling a view like modules::run('module/controller/action'). It just shows the router information of the loaded page. Is there any way to overcome this?Borderer
Awesome! Any word on how secure this is? I.e. can this be spoofed?Marked
This should be the accepted answer - or using the shortcut: $this->router->classMarquetry
Not if you change the routes in routes.php, $this->router returns the class the code runs in, but not the actual router masked with the override. Both answers are quite useful based on what you want to do.Homemaker
These methods have been depricated, use $this->router->class and $this->router->method insteadCouncilwoman
C
35

The methods are deprecated.

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

You can access the properties instead.

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

See codeigniter user guide

URI Routing methods fetch_directory(), fetch_class(), fetch_method()

With properties CI_Router::$directory, CI_Router::$class and CI_Router::$method being public and their respective fetch_*() no longer doing anything else to just return the properties - it doesn’t make sense to keep them.

Those are all internal, undocumented methods, but we’ve opted to deprecate them for now in order to maintain backwards-compatibility just in case. If some of you have utilized them, then you can now just access the properties instead:

$this->router->directory;
$this->router->class;
$this->router->method;
Contrition answered 5/1, 2016 at 12:10 Comment(0)
M
12

Another way

$this->router->class
Macrography answered 4/12, 2012 at 12:57 Comment(0)
B
11

As an addition

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Borderer answered 3/1, 2012 at 10:24 Comment(2)
This fetch_module() call doesn't work for me in CI 2.1.2. Can't find it in the /system/router.php file.Gradygrae
@timpeterson, It is only available in HMVC component as told in the answer.Borderer
M
8

Update

The answer was added was in 2015 and the following methods are deprecated now

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

Hi you should use the following approach

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

for this purpose but for using this you need to extend your hook from the CI_Controller and it works like a charm, you should not use uri segments

Mho answered 21/5, 2015 at 12:28 Comment(0)
B
3

If you using $this->uri->segment , if urls rewriting rules change, segments name matching will be lost.

Broddy answered 24/1, 2014 at 11:20 Comment(0)
C
3

Use This Code anywhere in class or libraries

    $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
Chiasmus answered 20/1, 2016 at 8:27 Comment(0)
T
1

Last segment of URL will always be the action. Please get like this:

$this->uri->segment('last_segment');
Tweeze answered 14/2, 2019 at 10:49 Comment(0)
H
-1
$this->router->fetch_class(); 

// fecth class the class in controller $this->router->fetch_method();

// method

Hyp answered 13/2, 2018 at 3:54 Comment(0)
I
-4

controller class is not working any functions.

so I recommend to you use the following scripts

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];
}
Intramural answered 5/9, 2016 at 3:26 Comment(1)
There are predefined functions available like $this->router->fetch_class() and fetch_method() then we don't need to do manually.Micropathology

© 2022 - 2024 — McMap. All rights reserved.