CodeIgniter-Chinese / CodeIgniter

开源 PHP 框架 CodeIgniter 中国社区分支
http://codeigniter.org.cn/
MIT License
65 stars 26 forks source link

default_controller is not working when enable_query_strings is enabled #28

Open Derrekteng opened 9 years ago

Derrekteng commented 9 years ago

When you set $config['enable_query_strings'] = TRUE; in config/config.php Then your default_controller will not work, even you've set these parameters. $route['default_controller'] = 'home'; $route['404_override'] = '';

Derrekteng commented 9 years ago

And I researched about the source code, in the system/core/Router.php, the _set_rouing() function, protected function _set_routing() { // Are query strings enabled in the config file? Normally CI doesn't utilize query strings // since URI segments are more search-engine friendly, but they can optionally be used. // If this feature is enabled, we will gather the directory/class/method a little differently if ($this->enable_query_strings) { $_d = $this->config->item('directory_trigger'); $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; if ($_d !== '') { $this->uri->filter_uri($_d); $this->set_directory($_d); }

        $_c = trim($this->config->item('controller_trigger'));
        if ( ! empty($_GET[$_c]))
        {
            $this->uri->filter_uri($_GET[$_c]);
            $this->set_class($_GET[$_c]);

            $_f = trim($this->config->item('function_trigger'));
            if ( ! empty($_GET[$_f]))
            {
                $this->uri->filter_uri($_GET[$_f]);
                $this->set_method($_GET[$_f]);
            }

            $this->uri->rsegments = array(
                1 => $this->class,
                2 => $this->method
            );
        }
        else
        {

/***

Now I fix it like this, although it's not elegant: protected function _set_routing() { // Are query strings enabled in the config file? Normally CI doesn't utilize query strings // since URI segments are more search-engine friendly, but they can optionally be used. // If this feature is enabled, we will gather the directory/class/method a little differently if ($this->enable_query_strings) { $_d = $this->config->item('directory_trigger'); $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; if ($_d !== '') { $this->uri->filter_uri($_d); $this->set_directory($_d); }

        $_c = trim($this->config->item('controller_trigger'));
        if ( ! empty($_GET[$_c]))
        {
            $this->uri->filter_uri($_GET[$_c]);
            $this->set_class($_GET[$_c]);

            $_f = trim($this->config->item('function_trigger'));
            if ( ! empty($_GET[$_f]))
            {
                $this->uri->filter_uri($_GET[$_f]);
                $this->set_method($_GET[$_f]);
            }

            $this->uri->rsegments = array(
                1 => $this->class,
                2 => $this->method
            );
        }
        else
        {
            /*
             * Derrekteng fix this, otherwise default_controller will not work if enable_query_strings is true
             */
            // Load the routes.php file.
            if (file_exists(APPPATH.'config/routes.php'))
            {
                include(APPPATH.'config/routes.php');
            }

            if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
            {
                include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
            }

            // Validate & get reserved routes
            if (isset($route) && is_array($route))
            {
                isset($route['default_controller']) && $this->default_controller = $route['default_controller'];
                isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];
                unset($route['default_controller'], $route['translate_uri_dashes']);
                $this->routes = $route;
            }
            $this->_set_default_controller();
        }

        // Routing rules don't apply to query strings and we don't need to detect
        // directories, so we're done here
        return;
    }

    // Load the routes.php file.
    if (file_exists(APPPATH.'config/routes.php'))
    {
        include(APPPATH.'config/routes.php');
    }

    if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
    {
        include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
    }

    // Validate & get reserved routes
    if (isset($route) && is_array($route))
    {
        isset($route['default_controller']) && $this->default_controller = $route['default_controller'];
        isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];
        unset($route['default_controller'], $route['translate_uri_dashes']);
        $this->routes = $route;
    }

    // Is there anything to parse?
    if ($this->uri->uri_string !== '')
    {
        $this->_parse_routes();
    }
    else
    {
        $this->_set_default_controller();
    }
}