私はclass MY_Controller extends CI_Controller
と大きなプロファイルセクションの共通ロジックを持っているので、プロファイルセクションの共通ロジックを使用してclass Profile extends MY_Controller
を作成しようとしました。しかし、class Index extends Profile
を作成しようとすると、エラーが発生します。
Fatal error: Class 'Profile' not found
CodeIgniterは、私が実行しているindex.php
でこのクラスを見つけようとします。
私の間違いはどこですか?または、一般的なロジックをマークアウトするためのより優れた方法がありますか?
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();
}
...
}
同じ問題が発生したため、このページを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
}
私がこのソリューションを気に入っている理由は、親クラスを作成する目的は、コードの繰り返しを削減することです。だから私はあなたのすべてのコントローラークラスに親クラスをコピー/ペーストすることを提案した他の答えは好きではありません。
Codeigniter 3で可能です。親ファイルを含めるだけで十分です。
require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...
拡張するすべてのクラスはapplication/COREディレクトリに存在する必要があるため、My_ControllerとProfileの両方がそこに存在する必要があります。すべての「エンドポイント」コントローラーは、application/controllersフォルダーにあります
[〜#〜]更新[〜#〜]
私は修正されたスタンドです。拡張クラスは同じファイルに存在する必要があります。 @Rooneylの答えは実装方法を示しています