Route to multiple sub folders in CodeIgniter Route to multiple sub folders in CodeIgniter codeigniter codeigniter

Route to multiple sub folders in CodeIgniter


This code was already on the internet but i modified it to make it work for codeigniter 2.1

See the old source here: http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/

Make a new file MY_Router.php in the application/core directory, copy the following code in it:

<?php/* * Custom router function v 0.2 * * Add functionality : read into more than one sub-folder * */Class MY_Router extends CI_Router{    Function MY_Router()    {        parent::__construct();    }    function _validate_request($segments)    {        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))        {            return $segments;        }        if (is_dir(APPPATH.'controllers/'.$segments[0]))        {            $this->set_directory($segments[0]);            $segments = array_slice($segments, 1);            /* ----------- ADDED CODE ------------ */            while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))            {                // Set the directory and remove it from the segment array            //$this->set_directory($this->directory . $segments[0]);            if (substr($this->directory, -1, 1) == '/')                $this->directory = $this->directory . $segments[0];            else                $this->directory = $this->directory . '/' . $segments[0];            $segments = array_slice($segments, 1);            }            if (substr($this->directory, -1, 1) != '/')                $this->directory = $this->directory . '/';            /* ----------- END ------------ */            if (count($segments) > 0)            {                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].EXT))                {                    show_404($this->fetch_directory().$segments[0]);                }            }            else            {                $this->set_class($this->default_controller);                $this->set_method('index');                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/' .$this->default_controller.EXT))                {                    $this->directory = '';                    return array();                }            }            return $segments;        }        show_404($segments[0]);    }}


"Out of the Box" codeigniter does not support multiple subdirectory levels in your controllers directory, just one.

There is a way to extend the routing class to support this, check this blog entry.


For Codeigniter 3.x compatibility: The usage of the EXT constant has been deprecated since dropping support for PHP 4. There’s no longer a need to maintain different filename extensions and in this new CodeIgniter version (3.x), the EXT constant has been removed. Use just ‘.php’ instead.

So the new MY_Router.php:

<?php/* * Custom router function v 0.3 * * Add functionality : read into more than one sub-folder * Compatible with Codeigniter 3.x * */Class MY_Router extends CI_Router{    Function MY_Router()    {        parent::__construct();    }    function _validate_request($segments)    {       if (file_exists(APPPATH.'controllers/'.$segments[0].".php"))        {            return $segments;        }        if (is_dir(APPPATH.'controllers/'.$segments[0]))        {            $this->set_directory($segments[0]);            $segments = array_slice($segments, 1);            /* ----------- ADDED CODE ------------ */            while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]))            {                // Set the directory and remove it from the segment array            //$this->set_directory($this->directory . $segments[0]);            if (substr($this->directory, -1, 1) == '/')                $this->directory = $this->directory . $segments[0];            else                $this->directory = $this->directory . '/' . $segments[0];            $segments = array_slice($segments, 1);            }            if (substr($this->directory, -1, 1) != '/')                $this->directory = $this->directory . '/';            /* ----------- END ------------ */            if (count($segments) > 0)            {                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].".php"))                {                    show_404($this->fetch_directory().$segments[0]);                }            }            else            {                $this->set_class($this->default_controller);                $this->set_method('index');                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/' .$this->default_controller.".php"))                {                    $this->directory = '';                    return array();                }            }            return $segments;        }        show_404($segments[0]);    }}