我正在尝试通过移植现有网站来了解更多有关codeigniter框架的知识 - 这不是太复杂,或者我认为。
目前,该网站已针对其用户进行复制,并根据网址显示个性化数据,例如,Joe可能将其网站设置为:
www.example.com/joe
www.example.com/joe/random-page.php
你用任何给定的用户名替换“joe”。 URL需要以这样的方式构造:/ joe / isnt FOR joe,它适用于joe的访问者,所以我不能依赖于这种用户登录或方法。我可以切换到joe.example.com
但不愿意。
有没有办法可以让Code Igniter更好玩这个游戏?
目前,它想要调用joe控制器。我最初的想法是试图找到一种在控制器不存在时调用默认控制器的方法,但是如果某些CI专业人员有不同的,更好的方法来处理这个问题,那就太棒了。
答案 0 :(得分:1)
有很多不同的方法可以解决这个问题。请注意,这两种解决方案都要求您编辑CI的核心文件。这意味着您无法在不破坏这些编辑的情况下进行升级。不幸的是钩子没有适当地解决这个问题。
简单方法:
system / vodeigniter / CodeIgniter.php中的第188-195行处理未找到控制器时发生的情况的逻辑。
更难但更好的方式:
有一个钩子(http://codeigniter.com/user_guide/general/hooks.html)
pre_controller
但这不起作用!原因是在确定控制器之后,但在实际执行任何操作之前调用它。换句话说,为时已晚。下一个早些时候
pre_system
实际上太早了,因为路由没有完成,你做路由的任何事情都会被覆盖。
所以我需要第一个控制器看起来一样,但最终调用一个不同的控制器。原因是页面是以分层方式访问的,因此它将是子部分的子部分,依此类推。
我所做的是在system / libraries / Controller.php的第43行添加
$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调用的控制器进行非常精细的控制。这将基于URL为您提供上帝模式控制您的控制器。这是一个黑客?是。它不优雅吗?绝对。但我需要它完成。
请记住,由于此编辑了核心文件,因此无法轻松升级。我认为Kohana框架有解决方案。
答案 1 :(得分:1)
我在Alex的帖子后继续阅读CI文档,并在routes.php file找到了我所需要的信息。
它允许你使用正则表达式来重写路由(URL),就像mod_rewrite一样,所以我可以删除用户名并最终将其作为参数传递。
答案 2 :(得分:1)
Upgrade to CodeIgniter 2.0并使用$ route ['404_override'] ='controller';或安装Modular Extensions,它做同样的事情,但现在他们使用$ route ['404']代替。