web-dev-qa-db-ja.com

CodeIgniterでのコントローラークラスの拡張

私はclass MY_Controller extends CI_Controllerと大きなプロファイルセクションの共通ロジックを持っているので、プロファイルセクションの共通ロジックを使用してclass Profile extends MY_Controllerを作成しようとしました。しかし、class Index extends Profileを作成しようとすると、エラーが発生します。

Fatal error: Class 'Profile' not found

CodeIgniterは、私が実行しているindex.phpでこのクラスを見つけようとします。

私の間違いはどこですか?または、一般的なロジックをマークアウトするためのより優れた方法がありますか?

20
Yekver

MY_Controllerを/ application/coreに置き、configにプレフィックスを設定したと思います。ただし、クラス名としてインデックスを使用する場合は注意が必要です。 Codeigniterの関数/メソッドとして、専用の動作があります。

そのコントローラーを拡張する場合は、クラスを同じファイルに配置する必要があります。

例えば。 /アプリケーションコア

/* start of php file */
class MY_Controller extends CI_Controller {
    public function __construct() {
       parent::__construct();
    }
...
}

class another_controller extends MY_Controller {
    public function __construct() {
       parent::__construct();
    }
...
}
/* end of php file */

/ application/controllers内

class foo extends MY_Controller {
    public function __construct() {
       parent::__construct();
    }
...
}

または

class bar extends another_controller {
    public function __construct() {
       parent::__construct();
    }
...
}
27
Rooneyl

同じ問題が発生したため、このページをGoogleで見つけました。ここに記載されている回答が気に入らなかったため、独自のソリューションを作成しました。

1)coreフォルダーに親クラスを配置します。

2)親クラスを含むすべてのクラスの最初にincludeステートメントを配置します。

したがって、一般的なコントローラーは次のようになります。

<?php

require_once APPPATH . 'core/Your_Base_Class.php';
// must use require_once instead of include or you will get an error when loading 404 pages

class NormalController extends Your_Base_Class
{
    public function __construct()
    {
        parent::__construct();

        // authentication/permissions code, or whatever you want to put here
    }

    // your methods go here
}

私がこのソリューションを気に入っている理由は、親クラスを作成する目的は、コードの繰り返しを削減することです。だから私はあなたのすべてのコントローラークラスに親クラスをコピー/ペーストすることを提案した他の答えは好きではありません。

5
AdmiralAdama

Codeigniter 3で可能です。親ファイルを含めるだけで十分です。

require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...
1
Cem Yıldız

拡張するすべてのクラスはapplication/COREディレクトリに存在する必要があるため、My_ControllerとProfileの両方がそこに存在する必要があります。すべての「エンドポイント」コントローラーは、application/controllersフォルダーにあります

[〜#〜]更新[〜#〜]

私は修正されたスタンドです。拡張クラスは同じファイルに存在する必要があります。 @Rooneylの答えは実装方法を示しています

0