Php 如果被调用的控制器不';不存在?
我正试图通过将一个现有的网站移植到codeigniter框架中来了解更多关于codeigniter框架的信息——我认为这并不太复杂 目前,该网站是为其用户复制的,并根据url提供个性化数据,例如,Joe的网站可能位于:Php 如果被调用的控制器不';不存在?,php,codeigniter,Php,Codeigniter,我正试图通过将一个现有的网站移植到codeigniter框架中来了解更多关于codeigniter框架的信息——我认为这并不太复杂 目前,该网站是为其用户复制的,并根据url提供个性化数据,例如,Joe的网站可能位于: www.example.com/joe www.example.com/joe/random-page.php 您可以用任何给定的用户名替换“joe”。URL的结构应该是这样的:/joe/isnotforjoe,它是为joe的访问者设计的,所以我不能依赖用户登录或这种方法。我可
www.example.com/joe
www.example.com/joe/random-page.php
您可以用任何给定的用户名替换“joe”。URL的结构应该是这样的:/joe/isnotforjoe,它是为joe的访问者设计的,所以我不能依赖用户登录或这种方法。我可以切换到joe.example.com
,但不愿意
有没有一种方法可以让代码点火器更好地发挥作用
目前,它希望调用joe控制器。我最初的想法是试图找到一种在控制器不存在时调用默认控制器的方法,但是如果一些CI专业人士有其他更好的方法来处理这个问题,那就太好了。有很多不同的方法可以实现这一点。请注意,这两种解决方案都要求您编辑CI的核心文件。这意味着如果不破坏这些编辑,就无法升级。不幸的是,钩子不能恰当地解决这个问题 简单的方法: system/vodeigniter/CodeIgniter.php中的第188-195行处理找不到控制器时发生的事情的逻辑 更难但更好的方法: 有一个钩子(http://codeigniter.com/user_guide/general/hooks.html) 前置控制器 但这不起作用原因是,这是在确定控制器之后,但在实际执行任何操作之前调用的。换句话说,为时已晚。下一个较早的 前置系统 实际上太早了,因为路由尚未完成,而您执行的任何操作都将覆盖路由 因此,我需要第一个控制器看起来相同,但最终调用不同的控制器。原因是该页面是以分层方式访问的,因此它将是一个子部分中的一个子部分,依此类推 我所做的是添加到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调用的控制器进行非常精细的控制。这将真正地给你上帝模式控制你的控制器的基础上的网址。是黑客吗?对不雅吗?绝对地但我需要完成它
只需记住,因为这会编辑核心文件,所以之后您无法轻松升级。我认为Kohana框架可以解决这个问题。有很多不同的方法可以解决这个问题。请注意,这两种解决方案都要求您编辑CI的核心文件。这意味着如果不破坏这些编辑,就无法升级。不幸的是,钩子不能恰当地解决这个问题 简单的方法: system/vodeigniter/CodeIgniter.php中的第188-195行处理找不到控制器时发生的事情的逻辑 更难但更好的方法: 有一个钩子(http://codeigniter.com/user_guide/general/hooks.html) 前置控制器 但这不起作用原因是,这是在确定控制器之后,但在实际执行任何操作之前调用的。换句话说,为时已晚。下一个较早的 前置系统 实际上太早了,因为路由尚未完成,而您执行的任何操作都将覆盖路由 因此,我需要第一个控制器看起来相同,但最终调用不同的控制器。原因是该页面是以分层方式访问的,因此它将是一个子部分中的一个子部分,依此类推 我所做的是添加到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调用的控制器进行非常精细的控制。这将真正地给你上帝模式控制你的控制器的基础上的网址。是黑客吗?对不雅吗?绝对地但我需要完成它
只需记住,因为这会编辑核心文件,所以之后您无法轻松升级。我认为Kohana框架可以解决这个问题。在Alex的帖子之后,我一直在阅读CI文档,并找到了有关的信息,这些信息正是我所需要的 它允许您使用正则表达式重写路由(URL),与mod_rewrite的方式大致相同,因此我可以