web-dev-qa-db-ja.com

CodeIgniter 2:CI_Controllerを複数回拡張する方法は?

Application/coreディレクトリに配置したMY_Controller.phpを作成して、CI_Controllerクラスを正常に拡張しました。

core/My_Controller.phpは次のようになります:

class MY_Controller extends CI_Controller {

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

その後、通常のコントローラを作成すると、次のようになります:

class Home extends MY_Controller {

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

    function index()
    {
        $this->load->view('home');
    }
}

私は管理バックエンドを作成していますが、My_Controllerの代わりに、コントローラーが拡張する別の基本クラスを作成したいと考えています。これは、管理コントローラーの一般的な方法(つまりauthentication_checkなど)を使用できるようにするためです。

解決できないのは、CI_Controllerを拡張する別のコントローラーを作成する方法です。

目的は、管理コントローラーがフロントエンドコントローラーとは異なる基本クラスを拡張することです。

管理ベースコントローラは次のようになります:

class MY_Admin_Controller extends CI_Controller {

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

管理ページの通常のコントローラー:

class Admin_home extends MY_Admin_Controller {

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

    function index()
    {
        $this->load->view('admin_home');
    }
}

問題は、CI_Controllerクラスを拡張するには、コントローラーファイルにPREFIX_Controller.phpという名前を付け、core /ディレクトリに配置する必要があることです。しかし、2つのコントローラークラスが必要で、それらに同じファイル名を付けることはできません。

27
Camsoft

両方を同じファイルに入れるだけで、これとまったく同じプロジェクトがあります。

MY_Controller.phpファイルにadminと通常の拡張コントローラーの両方があるだけで問題なく動作します。

MY_Controllerまたはその他の拡張ファイルの主な理由は、ベースファイル(ライブラリ、ヘルパーなど)をロードすると、CodeIgniterがそれらを自動的に開始するため、これらのファイルに多くのクラスを含めることができます。

編集:

それらをMY_Admin_ControllerまたはMY_Controllerと呼ぶ必要さえありません。Admin_ControllerファイルにはUser_ControllerAjax_ControllerMY_Controllerがあります。

28
Cubed Eye

あなたがやっていることは正しいです。これらすべてのファイルが_application/core_ディレクトリに必要です。これに関するPhil Sturgeonの投稿は次のとおりです。

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY
http://philsturgeon.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY/

コツは、__autoload()関数を使用することです-Philが彼の投稿で説明しています。

17
swatkins

これはとても簡単です。以下をせよ:

  1. 次のディレクトリに移動します:your_ci_app/application/core/と呼ばれるphpファイルを作成しますMY_Controller.php(このファイルは、上位の親クラスが存在する場所になります)
  2. 先ほど作成したファイルを開き、次のように複数のクラスを追加します。

    class Admin_Parent extends CI_Controller {
        public function __construct() {
            parent::__construct();
        }
    
        public function test() {
            var_dump("from Admin_Parent");
        }
    }
    
    class User_Parent extends CI_Controller {
    
        public function __construct() {
            parent::__construct();
        }
    
        public function test(){
            var_dump("from User_Parent");
        }
    
    }
    
  3. このディレクトリの下に子コントローラーを作成しますyour_ci_app/application/controllers/adminchild.php

  4. 開いた adminchild.phpとコントローラーコードを作成します。次のように、必ず親クラスの名前を拡張してください。

    class Adminchild extends Admin_Parent {
    
        function __construct() {
            parent::__construct();
        }
    
        function test() {
            parent::test();
        }
    
    }
    
3
CodeGodie

cI_controllerの代わりに別のクラスを拡張する場合は、ターゲットクラスを含める必要があります。例えば

include 'auth.php';

class test extends Auth
1
Saman Salehi

フォルダー内のすべてのファイル アプリケーション/コア



class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

公衆

class Public_Controller extends My_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

ダッシュボードには、管理者とユーザーの2つのサブクラスがあります。

class Dashboard_Controller extends My_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

管理者

class Admin_Controller extends Dashboard_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

ユーザー

class User_Controller extends Dashboard_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

に config/config.php

/* load class in core folder */
function my_load($class) {        
    if (strpos($class, 'CI_') !== 0) {            
        if (is_readable(APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php' )) {                
            require_once (APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php');                
        }
    }        
}

spl_autoload_register('my_load');

に controller/Home.php

//class Home extends MY_Controller {
//class Home extends Dashboard_Controller {
class Home extends Admin_Controller {

    public function index()
    {
        echo "This is " . __CLASS__ . "<br />";
        //$this->load->view('home');
    }
}
0
antelove