在 codeigniter 中特定类型的 404 路由没有自动加载数据库
Posted
技术标签:
【中文标题】在 codeigniter 中特定类型的 404 路由没有自动加载数据库【英文标题】:database is not getting autoloaded upon specific kind of 404 routing in codeigniter 【发布时间】:2012-07-22 22:15:55 【问题描述】:我有一个名为Hello.php
的控制器,它只有一个名为world
的方法。控制器在construct
时间和world
函数回显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;
请注意:我的数据库已使用 $autoload['libraries'] = array('database');
从 config/autoload.php 自动加载
从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";
现在我要做三件事:
-
致电
hello/world
- 期待Hello World
然后提交
致电 hello/fake
- 期待 404 路由,然后是 before rollback - after rollback
呼叫fake/fake
- 期待404路由,然后before rollback - after rollback
INSTEAD,这就是发生的事情
-
致电
hello/world
- 得到Hello World
然后按预期提交
致电hello/fake
- 获取before rollback
我的问题是关于这个
致电fake/fake
- 按预期获得before rollback - after rollback
我在第 1 点收到的错误消息。 2是:
遇到了 PHP 错误
严重性:通知
消息:未定义的属性:Bad_parameters::$db
文件名:controllers/bad_parameters.php
这是说 $db 未定义,而我确实从 config/autoload.php
自动加载数据库。
现在,如果我在 bad_parameters.php
的构造函数中包含 $this->load->database();
,则第 2 点按预期显示“回滚前 - 回滚后”,没有任何错误。
虽然 2 号和 3 号都是 404 路由,但 3 号示例工作正常,但 2 号示例存在此问题。为什么会发生这种情况?我已经在自动加载我的数据库。
【问题讨论】:
您查看过您的 PHP 错误日志吗?应该会出现 500 错误 我发现了一些东西... db->trans_rollback() 有问题... 让我更新一下问题。在我提到的第 2 点,PHP 执行正在停止,因为 trans_rollback 没有在第 2 点发生。 2 您看到的 trans_rollback 错误是什么? 好的.....我挖掘了更多.......我意识到这是一个自动加载问题......数据库没有自动加载......我正在更新问题 你可以添加一个 pre_system 钩子来纠正它。既然您提到了它,我注意到在定义 404 路由的框架中发生了类似的事情。可能是应用程序流程中的错误。路由是应该发生的第二件事 【参考方案1】:您使用的是哪个 CI 版本?尝试更新您的 CI 版本。
在 CI 2.1.0 中修复了一个错误(Reactor #19),其中 1) 404_override 路由在某些情况下被忽略,2) 当控制器存在时自动加载的库对 404_override 控制器不可用,但请求的方法没有。
ci changelog
ci upgrading
【讨论】:
我正在使用 CI 2.0.3 - 也许这是主要问题。将尝试升级到 CI 2.1.0 并稍后发表评论。【参考方案2】:我在这里找到了解决方法:
https://bitbucket.org/ellislab/codeigniter-reactor/changeset/2fa0e75a2101
为了保留这个答案:
替换 (system/core/CodeIgniter.php) 第 292 行:
show_404("$class/$method");
使用 (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']))
使用 (system/core/Router.php) 第 273 行:
if ( ! empty($this->routes['404_override']))
【讨论】:
但不会修改SYSTEM
文件夹中的文件是否...否...?
here 它说 大多数用户永远不需要这样做,但是对于那些想要显着改变 CodeIgniter 核心的人来说,确实存在替换或扩展它们的选项。
所以,你可以写一个alterator类来替换原来的方法,你仍然不会修改核心文件。我给您的更改将成为在您的更改器类中覆盖哪些方法的路标。以上是关于在 codeigniter 中特定类型的 404 路由没有自动加载数据库的主要内容,如果未能解决你的问题,请参考以下文章
自定义 404 未在实时服务器上的 Codeigniter 中显示
带有 quercus 的 codeigniter 显示 404 错误