你如何在 CodeIgniter 中使用多个控制器?
How do you use multiple controllers in CodeIgniter?
我是 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/';
例如,当我转到 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 returns 404。我已经尝试过很多操作,甚至像输入 localhost/website/index.php/mycontroller
一样愚蠢,但当然那是行不通的。
多控制器的正确使用方法是什么?我在这里做错了什么?请大家多多指教,谢谢!
(此外,这是我在 Whosebug 上的第一个正确问题,如果我做错了什么或格式不正确,请告诉我!)
问题是你的调用方式
在你的情况下,如果你没有 mod_rewrite 你应该尝试
localhost/website/index.php/mycontroller
如果您能够激活 mod_rewrite,您可以在 .htaccess 中添加以下行:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/
之后你可以像之前那样调用你的控制器
您正在使用路由规则将所有内容路由到站点控制器:
$route['(:any)'] = 'site/index/';
有了这样一个包罗万象的路由规则,您将永远不会到达其他控制器,例如您的 Mycontroller。
问题在于这条规则:
$route['(:any)'] = 'site/index/';
拦截一切...并将其传递给Site
控制器,作为index
方法的参数。所以如果你打电话:
/mycontroller
它实际上会映射到:
/site/index/mycontroller
路由发生在应用甚至查看控制器之前,并且路由规则按编写顺序考虑。
因此您需要将此规则放在规则列表的最底部,以便让其他规则起作用。所以通过在前面添加:
$route['mycontroller'] = 'mycontroller';
$route['(:any)'] = 'site/index/';
它应该可以正常工作(尽管这种方法有点不寻常,但你的全局 any
规则也是如此)因为它会首先检查请求的 URL 是否是 /mycontroller
,如果是,它会调用 myController
;否则它的行为将与您的 Site
控制器一样。
我是 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/';
例如,当我转到 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 returns 404。我已经尝试过很多操作,甚至像输入 localhost/website/index.php/mycontroller
一样愚蠢,但当然那是行不通的。
多控制器的正确使用方法是什么?我在这里做错了什么?请大家多多指教,谢谢!
(此外,这是我在 Whosebug 上的第一个正确问题,如果我做错了什么或格式不正确,请告诉我!)
问题是你的调用方式 在你的情况下,如果你没有 mod_rewrite 你应该尝试
localhost/website/index.php/mycontroller
如果您能够激活 mod_rewrite,您可以在 .htaccess 中添加以下行:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/
之后你可以像之前那样调用你的控制器
您正在使用路由规则将所有内容路由到站点控制器:
$route['(:any)'] = 'site/index/';
有了这样一个包罗万象的路由规则,您将永远不会到达其他控制器,例如您的 Mycontroller。
问题在于这条规则:
$route['(:any)'] = 'site/index/';
拦截一切...并将其传递给Site
控制器,作为index
方法的参数。所以如果你打电话:
/mycontroller
它实际上会映射到:
/site/index/mycontroller
路由发生在应用甚至查看控制器之前,并且路由规则按编写顺序考虑。
因此您需要将此规则放在规则列表的最底部,以便让其他规则起作用。所以通过在前面添加:
$route['mycontroller'] = 'mycontroller';
$route['(:any)'] = 'site/index/';
它应该可以正常工作(尽管这种方法有点不寻常,但你的全局 any
规则也是如此)因为它会首先检查请求的 URL 是否是 /mycontroller
,如果是,它会调用 myController
;否则它的行为将与您的 Site
控制器一样。