0

次のように CI_Controller を拡張しました。

// base extend
class MY_Controller extends CI_Controller {
      public $CI = array();

      public function __construct() {
        parent::__construct();
        $this->CI = & get_instance();
      }
      public function isUser(){
      // for example
      }
}

// admin extended
class MY_AdminController extends MY_Controller {

     public $admin = array();

     public function __construct() {

        parent::__construct();

        $this->CI->lang->load('admin');

        $this->admin['lang'] = $this->CI->lang->line('admin');

        $this->CI->load->vars($this->admin);

     }


     public function isAdmin(){
     //for example
     }
}

// extends for modules
class MY_AdminModuleController extends MY_AdminController {
     public function __construct() {
        parent::__construct();
        $this->CI->load->view('_header');
     }
     public function isAllowedModule(){
     // example
     }
     public function pseudoDestruct(){
        $this->CI->load->view('_footer');
     }
}

それでうまくいきます。しかし、post_controllerイベントをフックして my を追加しようとするMY_AdminModuleController->pseudoDestruct()ので、config.php でフックを有効にし、次の行をフックに追加しました。

$hook['post_controller'] = array(
    'class' => 'MY_AdminModuleController',
    'function' => 'pseudoDestruct',
    'filename' => 'MY_Controller.php',
    'filepath' => 'core'
);

しかし、MY_AdminController のコンストラクターで lang-file をロードする際に問題が発生しました。nullフックから呼び出されると(通常使用すると)返さtrueれ、フロントエンドで未定義のインデックスについて通知があります。いいえ、通知を無効にしたくありません。問題を解決したいのです。また、MY_AdminController のコンストラクターに構成の読み込みがあり、読み込みも良好です。

4

1 に答える 1

1

少なくともその特定の方法では、それはできません。CodeIgniter は 1 つのコントローラー インスタンスのみを持つように設計されていますが、フックは新しいインスタンスを作成し、lang ファイルはその新しいインスタンスに読み込まれません。get_instance()また、コントローラ クラスから呼び出す必要はありませんget_instance()。返されるのはクラスです。

いずれにせよ、フックとして使用する通常の関数を宣言できます。MY_Controller.php ファイルにも問題なく配置できます。

function pseudo_destruct()
{
    get_instance()->load->view('_footer');
}

次に、このフックを使用します。

$hook['post_controller'] = array(
    'function' => 'pseudo_destruct',
    'filename' => 'MY_Controller.php',
    'filepath' => 'core'
);
于 2013-09-04T09:35:54.237 に答える