4

Hello.phpというメソッドが 1 つしかないというコントローラーがあり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;
    }
}

注意してください: 私のデータベースは config/autoload.php からオートロードされています$autoload['libraries'] = array('database');


から、config/routes.php404 エラーを 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";
    }
}

今、私は3つのことをするつもりです:

  1. 呼び出し- COMMITをhello/world期待Hello World
  2. への呼び出しhello/fake- 404 ルーティングを想定してからbefore rollback - after rollback
  3. への呼び出しfake/fake- 404 ルーティングを想定してからbefore rollback - after rollback

INSTEAD、これが起こることです

  1. 呼び出しhello/world-Hello World期待どおりに COMMIT を取得
  2. への呼び出しhello/fake- 取得before rollback<--私の質問はこれについてです
  3. への呼び出し- 期待どおりfake/fakeに取得before rollback - after rollback

ポイント番号で表示されるエラーメッセージ。2 は次のとおりです。

PHP エラーが発生しました

重大度: 通知

メッセージ: 未定義のプロパティ: Bad_parameters::$db

ファイル名: controllers/bad_parameters.php

からデータベースを自動ロードしましたが、 $db は未定義であると言っていますconfig/autoload.php

今、私がコンストラクターに含める$this->load->database();と、bad_parameters.phpポイント2はエラーなしで期待どおりに「ロールバック前 - ロールバック後」を示します。

2 番と 3 番の両方が 404 ルーティングですが、3 番の例は正常に動作していますが、2 番の例にはこの問題があります。なぜこれが起こる必要がありますか?すでにデータベースをオートロードしています。

4

2 に答える 2

1

使用しているCIのバージョンは? CI バージョンを更新してみてください。

CI 2.1.0 でバグ (Reactor #19) が修正されました。1) 場合によっては 404_override ルートが無視されていました。2) コントローラーが存在する場合に、自動ロードされたライブラリが 404_override コントローラーで使用できませんでしたが、要求されたメソッドは使用できました。いいえ。

ci 変更ログ

ciのアップグレード

于 2012-07-30T05:32:25.470 に答える
0

ここで私はこれに対する修正を見つけました:

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']))
于 2012-07-30T07:03:42.810 に答える