Codeigniter Routes regex - using dashes in controller/method names

前端 未结 9 1146
小鲜肉
小鲜肉 2020-11-29 01:32

I\'m looking for a one line route to route dashed controller and method names to the actual underscored controller and method names.

For example the URL



        
相关标签:
9条回答
  • 2020-11-29 01:45

    I'm not sure if you could do that with a route...

    However, somewhere in the Codeigniter core libraries (possibly Router or URI) will be something that converts the underscored uris into a camelcase class name.

    I had a quick look and couldn't find it, but if you do, just copy that library to your application/libraries folder, and modify it there.

    0 讨论(0)
  • 2020-11-29 01:55

    Just coming back to this question after upgrading to CodeIgniter 2. Here is a solution which is more robust than the accepted answer because it will survive CodeIgniter core updates.

    <?php
    class MY_Router extends CI_Router
    { 
        public function set_class($class) 
        {
            parent::set_class($this->_repl($class));
        }
    
        public function set_method($method) 
        {
            parent::set_method($this->_repl($method));
        }
    
        public function _validate_request($segments)
        {
            if (isset($segments[0]))
                $segments[0] = $this->_repl($segments[0]);
            if (isset($segments[1]))
                $segments[1] = $this->_repl($segments[1]);
    
            return parent::_validate_request($segments);
        }
    
        private function _repl($s)
        {
            return str_replace('-', '_', $s);
        }
    }
    

    It should be saved as application/core/MY_Router.php. Now, you can have Controller and Method names with underscores in them such as Abc_Def (in file abc_def.php) and refer to them with the URL /abc-def.

    0 讨论(0)
  • 2020-11-29 01:59

    This is an old question, but I'd like to post that e-mike had a great solution to this problem, and a lot simpler.

    <?php
        public function _set_request($segments){
            // Fix only the first 2 segments
            for($i = 0; $i < 2; ++$i){
                if(isset($segments[$i])){
                    $segments[$i] = str_replace('-', '_', $segments[$i]);
                }
            }
    
            // Run the original _set_request method now, giving it our newly replaced segments
            parent::_set_request($segments);
        }
    ?>
    

    Hope this helps anyone else with this problem.

    0 讨论(0)
提交回复
热议问题