1

我正在尝试开发一个人们可以访问 mysite.com/username 的社交网络。我使用了 _remap 函数并且我得到了它的工作,但是它没有加载我的任何其他控制器。请问有人可以帮忙吗?

这是我的默认控制器:

if ( ! defined('BASEPATH')) exit('No direct script access allowed');


class Welcome extends CI_Controller {

    public function index($username = NULL)
    {
        $this->load->model('user_model');
        if ($this->user_model->is_a_username($username)) {
            $data['title'] = $username;
            $data['main_content'] = 'users/profile_page';
            $this->load->view('shared/template',$data);
        } else {
            $this->home();
        }
    }

    public function _remap($method, $params = array())
    {
        if (method_exists($this, $method))
        {
            return call_user_func_array(array($this, $method), $params);
        }
        show_404();
    }

    public function home()
    {
        if ($this->ion_auth->logged_in()) {
            $data['title'] = 'Carnect';
            $data['main_content'] = 'users/wall_page';
            $this->load->view('shared/template',$data); #if logged in show the user's wall
        } else {
            $data['title'] = 'Carnect';
            $data['main_content'] = 'welcome/index';
            $this->load->view('shared/template',$data); #if not logged in show the home page
        }       
    }
}

这是我的路线文件:

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$route['default_controller'] = "welcome";
$route['404_override'] = '';


$route['login'] = "auth/login";
$route['logout'] = "auth/logout";
$route['register'] = "auth/create_user";


/*$route['news'] = "news/index";
$route['politics'] = "politics/index";
$route['culture'] = "culture/index";
$route['messages'] = "messages/index";*/


$route['(:any)/(:any)'] = "$1/$2";
$route['(:any)/(:any)/(:any)'] = "$1/$2/$3";
$route['(.*)'] = 'welcome/index/$1';

不会加载的控制器之一的示例..

session_start();

class News extends CI_Controller {

    function News()
    {
        parent::Controller();
    }

    function index() {
        $data['title'] = 'Politics';
        $data['main_content'] = 'news/index';
        $this->load->view('shared/template',$data);
    }
}

4

2 回答 2

1

我正在开发一个对这些网址有类似要求的项目。

我通过添加这样的路线来做到这一点:

$routes['news'] = 'news/index';

或者

$routes['news'] = 'news';

这正是您评论过的行。

可悲的是,没有这些线是不可能的(至少我做不到)。

如果您的 URL 是:example.com/news/index,它将匹配规则$routes['(:any)/(:any)'],但如果是example.com/news,它不会匹配任何内容并转到您的最后一条规则。

CodeIgniter 的 Routing 不采用真正的段,而是 url 中显示的 uri 段。因此,您的 urlexample.com/news将被解释为$username = news.

您必须为每个只有 1 个 uri 段的 url 执行此 uri 路由。您需要确保没有用户与您的控制器具有相同的用户名,否则他/她将永远无法访问用户页面。

于 2012-11-26T08:36:27.433 回答
0

您必须在application/config/routes.php文件中编写规则只需添加以下行

$route['(:any)'] = "welcome/index/$1";

http://example.com/username如果您添加了用于从 url 中删除文件的 .htaccess 规则,您可以index.php访问,或者您可以访问http://example.com/index.php/username

于 2012-11-26T08:10:32.013 回答