CI基本URL路由

时间:2010-07-20 04:00:10

标签: php codeigniter

例如,在Twitter中,您可以使用以下URL格式: http://twitter.com/username/

“username”是用户的用户名。

我想知道在Codeigniter中使用它的正确方法。我需要相同的格式。我有其他页面,如用户帐户管理,约等。我是否需要通过一个函数路由它,检查该用户是否存在,然后将其传递到另一个控制器?谢谢!

4 个答案:

答案 0 :(得分:4)

通过在MY_Router.php目录中放置application\libraries来扩展路由器类,并使用以下代码:

<?php 

class MY_Router extends CI_Router {

    function _validate_request($segments)
    {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
        {
            return $segments;
        }

        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {       
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            if (count($segments) > 0)
            {
                // Does the requested controller exist in the sub-folder?
                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');

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                {
                    $this->directory = '';
                    return array();
                }

            }

            return $segments;
        }

        // **
        // THIS IS THE NEW CODE BELOW
        // **
        // It forces the segments to your known class (user) & method (index)
        // for all controller calls that don't exist as files or inside
        // directories

        $my_segments = array('user', 'index', $segments[0]);    

        return $my_segments;
    }
}

现在,只需使用索引方法创建一个User控制器,该方法接受用户名作为第一个参数:

<?php

class User extends Controller {

    function index($username = '')
    {
        // Validate the HECK out of $username
        // Validate the HECK out of $username
        // VALIDATE THE HECK OUT OF $username
        echo $username;
        exit();
    }

}

这是一个回答!测试CI 1.7.2。不知道2.0,但是......

答案 1 :(得分:3)

在CI 2.0中,您可以毫不费力地执行此操作,只需添加路线:

$route['404_override'] = 'users';

答案 2 :(得分:2)

这样做很容易:

http://twitter.com/u/username

您只需创建名为“U”的控制器

class U extends Controller{

    function index($username){
        echo $username;
    }
}

如果你想要它在基本网址,那么需要做一些像路由等其他事情。其他人可能会知道这个CI。

答案 3 :(得分:0)

假设您有一个名为“Author”的Controller,其中一个名为“page”的函数将一个用户名作为参数:

class Author extends CI_Controller {

public function page($username = null) {
    if($username == null) { //checking for forced url page load without username specified
        //do a 404 redirect
    } else {
        $this->load->model('m_users');
        if($this->m_users->exists($username)) { // checking if requested username exists

            //do stuff with the user here

        } else { //otherwise redirect
            //do a 404 redirect
        }
    }
}

然后我会使用 config / routes.php 底部的以下代码将“ your-domain.com/author/page/username ”路由到“的 your-domain.com/username

if($handle = opendir(APPPATH.'/controllers')) {
    while(false !== ($controller = readdir($handle))) {
        if($controller != '.' && $controller != '..' && strstr($controller, '.') == '.php') {
            $route[strstr($controller, '.', true)] = strstr($controller, '.', true);
            $route[strstr($controller, '.', true).'/(:any)'] = strstr($controller, '.', true).'/$1';
        }
    }
    closedir($handle);
}
$route['([a-zA-Z0-9_-]+)'] = 'author/page/$1';

这样,只有当控制器与你的域名时,才会将 your-domain.com/whatever 的任何请求发送到 your-domain.com/author/page/whatever 名称“随便”不存在。如果存在,则它将访问Controller。

此外,在此之后,如果您想执行 your-domain.com/login 之类的操作,请转到 your-domain.com/auth/login 你可以通过在 config / routes.php

中添加以下行来实现
//...
$route['login'] = 'auth/login'; //add this line before the one specified above
$route['([a-zA-Z0-9_-]+)'] = 'author/page/$1';