2010-10-27 43 views
0

我试图通过移植一个现有的网站来了解更多关于codeigniter框架 - 这不是太复杂,或者所以我想。如果被调用的控制器不存在,我可以调用默认控制器吗?

目前,该网站被复制为用户提出了一种基于链接的个性化数据,例如,Joe可能有他的网站在:

www.example.com/joe 
www.example.com/joe/random-page.php 

而且你会替换“乔”与任何特定用户名称。这些URL需要这样构造:/ joe/isnt FOR joe,它是joe的访问者,所以我不能依赖用户登录或此类方法。我可以切换到joe.example.com但宁愿不。

有没有一种方法可以使这个剧本与Code Igniter很好?

目前,它想调用joe控制器。我最初的想法是试图找到一种方法来在控制器不存在时调用默认控制器,但如果某些CI专家建议采用另一种更好的方式来处理此问题,那就太好了。

回答

1

Upgrade to CodeIgniter 2.0并使用$ route ['404_override'] ='controller';或者安装可以做同样事情的模块化扩展,但是现在它们使用$ route ['404']代替。

1

有很多不同的方法可以解决这个问题。只需要警告,这两种解决方案都需要您编辑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框架可以解决这个问题。

+0

这是非常复杂,然后我预期。我期待着“当然,这很容易!”答案:P谢谢你的意见。目前,我正在探索通过mod_rewrite解决我的问题,以获得更简单的解决方案。 – Will 2010-10-27 03:57:17

+0

经过大量的阅读,我发现这可以很容易地完成,[routes.php文件](http://codeigniter.com/user_guide/general/routing.html)。 – Will 2010-10-27 05:57:50

+0

哎呀抱歉,我忘记了这一点。当我最初实施我的解决方案时,我研究了它,但我发现它太简单了。我认为我没有使用它的原因是因为它最多只能达到3层。无论如何,我希望我的答案能够解决别人的问题。 – theAlexPoon 2010-10-27 06:26:36

1

我在Alex的帖子后不断阅读CI文档,发现有关routes.php file的信息,这些信息完全符合我的需求。

它允许您使用正则表达式重写路由(URL),这与mod_rewrite的方式非常相似,所以我可以删除用户名并最终将其作为参数传递。