有很多不同的方法可以解决这个问题。只需要警告,这两种解决方案都需要您编辑CI的核心文件。这意味着你不能在不破坏这些编辑的情况下进行升级。不幸的是,钩子并没有适当解决这个问题。
最简单的办法:
线188-195在系统/ vodeigniter/CodeIgniter.php办理时未找到控制器会发生什么逻辑。
较硬但更好的方法:
有一个钩子(http://codeigniter.com/user_guide/general/hooks.html)
pre_controller
但这不行!原因是在确定了控制器之后,但在实际执行任何事情之前调用了它。换句话说,太晚了。接下来的较早的一个
pre_system
其实太早,因为路由尚未完成,任何你做的路由将被覆盖。
所以我需要第一个控制器看起来一样,但最终调用不同的控制器。原因在于该页面是以分层方式访问的,因此它将成为分段的子部分等等。
我所做的是增加对系统/库线43/Controller.php这样
$this->_ci_initialize();
基本上我是有自动载入库之前控制器是所谓的,因为我发现该库没有加载在控制器被调用之前,我需要这样做,因为我需要检查用户访问认证并直接挂接到路由本身。
当我这样做后,我扩展了自动加载的本地核心库之一(在本例中为了应用程序的特定原因),然后执行重新路由。
$RTR = & load_class('Router');
$this->URI = & load_class('URI');
$this->URI->_fetch_uri_string();
我在开始时调用了这段代码,然后把我的逻辑放在后面。这是我的重新路由逻辑看起来像样本
if ($this->segment(1) == 'institute')
{
if (! in_array($this->segment(3), $course))
{
$RTR->set_class('courseClass');
$RTR->set_method('index');
if (! $this->segment(4))
{
$RTR->set_class('course');
$RTR->set_method('index');
}
else
{
$RTR->set_class('course');
$RTR->set_method($this->segment(3));
}
}
原来是更长。我可能应该考虑编写某种插件或更好的方式来处理重写而不是愚蠢的spagetti逻辑。但是,我需要根据URL调用控制器的非常好的纹理控制。这将实际上给你上帝模式控制你的控制器的基础上的网址。这是一个黑客?是。它不雅?绝对。但我需要它完成。
只要记住,因为这编辑了核心文件,你不能轻易升级之后。我认为Kohana框架可以解决这个问题。
这是非常复杂,然后我预期。我期待着“当然,这很容易!”答案:P谢谢你的意见。目前,我正在探索通过mod_rewrite解决我的问题,以获得更简单的解决方案。 – Will 2010-10-27 03:57:17
经过大量的阅读,我发现这可以很容易地完成,[routes.php文件](http://codeigniter.com/user_guide/general/routing.html)。 – Will 2010-10-27 05:57:50
哎呀抱歉,我忘记了这一点。当我最初实施我的解决方案时,我研究了它,但我发现它太简单了。我认为我没有使用它的原因是因为它最多只能达到3层。无论如何,我希望我的答案能够解决别人的问题。 – theAlexPoon 2010-10-27 06:26:36