数据库没有在codeigniter中的特定类型的404路由上自动加载

时间:2012-07-24 14:52:16

标签: codeigniter routes http-status-code-404 autoload

我有一个名为Hello.php的控制器,它只有一个名为world的方法。控制器在construct时间和world函数echo hello world启动事务并提交事务。

class Hello extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->db->trans_begin;
    }

    public function world(){
        echo "hello world";
        $this->db->trans_commit;
    }
}

请注意:我的数据库已从config / autoload.php自动加载$autoload['libraries'] = array('database');


config/routes.php我已将404错误路由到名为bad_parameters.php的控制器$route['404_override'] = 'bad_parameters';


class Bad_parameters extends CI_Controller {

    public function __construct() {
        parent::__construct();
    }

    public function index(){
        echo "before rollback - ";
        $this->db->trans_rollback();
        echo "after rollback";
    }
}

现在我要做三件事:

  1. 致电hello/world - 期待Hello World然后发送COMMIT
  2. 致电hello/fake - 期待404路由,然后before rollback - after rollback
  3. 致电fake/fake - 期待404路由,然后before rollback - after rollback
  4. INSTEAD ,这就是发生的事情

    1. 致电hello/world - 获取Hello World然后按预期执行COMMIT
    2. 致电hello/fake - 获取before rollback< - 我的问题是关于此
    3. 致电fake/fake - 按预期获得before rollback - after rollback
    4. 我在第一点得到的错误消息。 2是:

        

      遇到PHP错误

           

      严重性:注意

           

      消息:未定义属性:Bad_parameters :: $ db

           

      文件名:controllers / bad_parameters.php

      这是说$ db是未定义的,而我DID是从config/autoload.php自动加载数据库。

      现在,如果我在$this->load->database();的CONSTRUCTOR中包含bad_parameters.php,则在没有任何错误的情况下,点2之前显示'回滚前 - 回滚后'。

      尽管第2号和第3号都是404路由,但是第3个例子工作正常但是第2个例子有这个问题。为什么会这样?我已经在自动加载我的数据库了。

2 个答案:

答案 0 :(得分:1)

您正在使用哪个CI版本?尝试更新CI版本。

在CI 2.1.0修复了一个错误(Reactor#19),其中1)404_override路由在某些情况下被忽略,2)当控制器存在时,404_override控制器无法使用自动加载的库但是要求的方法没有。

ci changelog

ci upgrading

答案 1 :(得分:0)

我在这里找到了解决方法:

https://bitbucket.org/ellislab/codeigniter-reactor/changeset/2fa0e75a2101

保留这个答案:

replace(system / core / CodeIgniter.php)第292行:

show_404("{$class}/{$method}");

with(system / core / CodeIgniter.php)第292行:

// Check and see if we are using a 404 override and use it.
if ( ! empty($RTR->routes['404_override']))
{
    $x = explode('/', $RTR->routes['404_override']);
    $class = $x[0];
    $method = (isset($x[1]) ? $x[1] : 'index');
}
else
{
    show_404("{$class}/{$method}");
}

并替换(system / core / Router.php)第273行:

if (!empty($this->routes['404_override']))

with(system / core / Router.php)第273行:

if ( ! empty($this->routes['404_override']))