27

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つのコントローラークラスが必要であり、同じファイル名を持つことはできません。

4

5 に答える 5

29

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

ファイルには管理者と通常の拡張コントローラーの両方が含まれているだけで、正常MY_Controller.phpに動作します。

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

編集:

あなたはそれらを呼び出す必要さえありませんMY_Admin_ControllerまたはMY_Controller、私たちはAdmin_ControllerそしてファイルにありUser_ControllerますAjax_ControllerMY_Controller

于 2011-10-02T16:30:12.407 に答える
17

あなたがしていることは正しいです。application/coreディレクトリ内にこれらのファイルがすべて必要です。これに関するPhilSturgeonの投稿は次のとおりです。

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が彼の投稿で説明している関数を使用することです。

于 2011-10-03T14:17:02.193 に答える
3

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

  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();
        }
    
    }
    
于 2015-02-05T17:11:22.833 に答える
1

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

include 'auth.php';

class test extends Auth
于 2016-06-18T07:56:59.590 に答える
0

application/coreフォルダー内のすべてのファイル


MYはサブクラスCIです
MYには2つのサブクラスPublicとDashboardがあります

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');
    }
}
于 2018-08-14T06:44:40.543 に答える