如何在CodeIgniter中使用多个控制器?

时间:2015-06-26 12:43:31

标签: php codeigniter controller

我是CodeIgniter的新手,我刚刚浏览了一些用户指南,帮助我了解如何使用多个控制器。

我已经弄清楚如何使用他们的一个示例加载多个页面。这是我的默认控制器,名为Site.php:

class Site extends CI_Controller {

public function index($page = 'home') {
    if ( ! file_exists(APPPATH.'/views/'.$page.'.php')) {
        // Whoops, we don't have a page for that!
        show_404();
    }

    $data['title'] = ucfirst($page);

    $this->load->view('header', $data);
    $this->load->view($page, $data);
    $this->load->view('footer', $data);

    }
}

这一切都很好用我的routes.php:

$route['default_controller'] = 'site';
$route['(:any)'] = 'site/index/$1';

例如,当我转到localhost/website/index.php/about时,我有一些正确加载的视图。

现在,进一步了解控制器和URI路由。我创建了一个新的控制器application/controllers/MyController.php,它的编码如下:

class MyController extends CI_Controller {
    public function index() {
        $this->load->view('header');
        $this->load->view('my_controller');
        $this->load->view('footer');
    }
}

问题是,我不知道如何访问此页面。 我知道默认的URI模式是example.com/class/function/id/,但我尝试了localhost/website/mycontroller但它不起作用。 Apache返回404.我尝试过很多操作,甚至像打字localhost/website/index.php/mycontroller一样愚蠢,但当然不行。


使用多个控制器的正确方法是什么?我在这做错了什么?请帮助我学习,谢谢!

(另外,这是我在StackOverflow上的第一个正确的问题,如果我做错了什么或格式化不正确,请告诉我!)

3 个答案:

答案 0 :(得分:1)

您使用路由规则将所有内容路由到站点控制器:

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

使用这样一个包罗万象的路由规则,你永远不会到达其他控制器,例如你的Mycontroller。

答案 1 :(得分:1)

问题在于这条规则:

while read line; do 
    tail -c 5 <<< $line
done < file

拦截所有内容 ...并将其作为$route['(:any)'] = 'site/index/$1'; 方法的参数传递给Site控制器。所以如果你打电话:

index

它实际上会映射到:

/mycontroller

路由在应用程序查看控制器之前发生,并且路由规则按照它们的编写顺序进行考虑。

因此,您需要将此规则放在规则列表的最底部,以便让其他规则有效。所以在前面加上这个:

/site/index/mycontroller

它应该可以正常工作(尽管是非常不寻常的方法,但您的全局$route['mycontroller'] = 'mycontroller'; $route['(:any)'] = 'site/index/$1'; 规则也是如此),因为它会首先检查所请求的网址是否为any,如果是,则会调用{{1 }};否则它的行为将与您/mycontroller控制器的行为相同。

答案 2 :(得分:-1)

问题是你的调用方法 在你的情况下,如果你没有mod_rewrite,你应该尝试

localhost/website/index.php/mycontroller

如果你能够激活mod_rewrite,你可以在.htaccess中添加以下行:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1

之后你可以像之前那样打电话给你的控制器