如何在 CodeIgniter 中使用多个控制器?
Posted
技术标签:
【中文标题】如何在 CodeIgniter 中使用多个控制器?【英文标题】:How do you use multiple controllers in CodeIgniter? 【发布时间】:2015-09-13 10:13:32 【问题描述】:我是 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
一样愚蠢,但当然这不起作用。
使用多个控制器的正确方法是什么?我在这里做错了什么?请协助我学习,谢谢!
(另外,这是我在 *** 上的第一个正确问题,如果我做错了什么或格式不正确,请告诉我!)
【问题讨论】:
$route['(:any)'] = 'site/index/$1';
从您的 routes.php 中删除它,一切都会正常。
【参考方案1】:
问题在于这条规则:
$route['(:any)'] = 'site/index/$1';
拦截一切...并将其传递给Site
控制器,作为index
方法的参数。所以如果你打电话:
/mycontroller
它实际上会映射到:
/site/index/mycontroller
路由发生在应用程序甚至查看控制器之前,并且路由规则被考虑到它们被写入的顺序。
因此,您需要将此规则放在规则列表的最底部,以便让其他规则起作用。因此,通过在前面添加:
$route['mycontroller'] = 'mycontroller';
$route['(:any)'] = 'site/index/$1';
它应该可以正常工作(虽然方法有点不寻常,但您的全局 any
规则也是如此),因为它将首先检查请求的 URL 是否为 /mycontroller
,如果是,它将调用 myController
;否则,它的行为将与您的 Site
控制器一样。
【讨论】:
感谢您的回答。包括mycontroller
路由有效,尽管我对any
route 有疑问。你说这很不寻常,但是如果我没有any
路由,我将无法访问在我的Site
控制器中生成的页面。这是非黑即白的事情,我应该明确选择使用多个控制器还是只为所有页面使用一个控制器?解决这个问题的最佳方法是什么? (我应该在另一个问题中问这个吗?)
不客气。是的,这里有点黑或白。根据您的站点结构,您可以选择每个。我已经向您展示了如何继续使用一个控制器,并基本上将所有其他控制器列入白名单。您还可以避免使用any
路由并仅映射实际存在的那些方法(或视图,在您的情况下)......所以对于about
,您可以写:$route['about'] = 'site/index/about';
这样您就不会拥有对抗any
路由,你的其他控制器将正常工作。
如果我在上面的评论中写的内容难以阅读或没有意义,也许最好写一个关于它的新问题。
不,您提供的内容不仅有意义,而且实际上使我能够同时使用多个控制器和单控制器方法。通过default_controller
、mycontroller
和any
这三个路线,我可以访问localhost/website/index.php/[home,about,mycontroller]
的每个页面,这非常酷。你帮了大忙,谢谢。我最终会决定选择哪种网站结构。
哈哈,你说得对。似乎有很多关于编辑 htaccess 文件的信息,所以万一我遇到任何问题,我会提出另一个问题。【参考方案2】:
您正在使用路由规则将所有内容路由到您的站点控制器:
$route['(:any)'] = 'site/index/$1';
有了这样一个包罗万象的路由规则,您将永远无法访问其他控制器,例如您的 Mycontroller。
【讨论】:
【参考方案3】:问题是你的调用方法 在你的情况下,如果你没有 mod_rewrite ,你应该尝试
localhost/website/index.php/mycontroller
如果您能够激活 mod_rewrite,您可以在 .htaccess 中添加以下行:
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php/$1
之后你可以像之前尝试的那样调用你的控制器
【讨论】:
感谢您的回复。我正在运行 WAMP,所以我可以控制重写模块。我停用了它并尝试了您的第一个建议,它没有用。您指的是哪个 .htaccess 文件?我的 /application/ 文件夹中的那个?目前,它们都有某种 XML,两组index.php
部分...
如果您仍然收到 404 - 我不确定 - 您是否删除了您的站点控制器,我的第一个建议应该将您路由到站点/索引控制器(就像此处的其他建议一样)跨度>
Shomz 你完全错了——因为他明确写了,如果 url 看起来像 localhost/website/mycontroller
,如果 apache 返回 404,他会得到 404——你在 ci 中没有路由问题,因为不涉及 ci这里
是的,他写了 apache - 这有点不同 @Psymøn 您是否收到类似 The requested URL /website/mycontroller/ was not found on this server.
的错误,或者您是否在格式良好的页面中收到类似 404 Page Not Found
的 CI 消息
以上是关于如何在 CodeIgniter 中使用多个控制器?的主要内容,如果未能解决你的问题,请参考以下文章
在 codeigniter 中,如何将数组值从控制器传递到同一视图页面?
在codeigniter中上传多个文件,并使用数组重命名每个文件