CodeIgniterでコントローラで共通の処理をしたいときってありますよね。
普通だったらextendしている親クラスをいじります。
でもコントローラが継承しているCI_Controllerはコアクラスなのでいじりたくありません。
そんな時は、コアクラスを独自で作って、独自コアクラスを継承しましょう。
環境
- CodeIgniter3.1.5
- PHP 5.6.30
コアクラスを作る
core/MY_Controllerを作る
まずはapplication/coreディレクトリにMy_Controller.phpを作ります。
そしてCI_Controllerを継承してやります。
/** * MY_Controller * * @property CI_Loader $load * @property CI_Input $input * @property CI_Session $session * @property CI_Config $config * @property CI_Form_validation $form_validation * @property CI_URI $uri * @property Mailer $mailer */ class MY_Controller extends CI_Controller { public function test(){ print 'test'; } }
これでコアクラスの作成は完了です。
コントローラを作ってMY_Contorllerを継承する
適当にコントローラを作ってMY_Controllerを継承してみましょう。
application/controllersにSample.phpを作ってCI_ControllerではなくMY_Contorllerを継承させてみます。
class Sample extends MY_Controller { public function index() { // MY_Contorllerのtext()を呼び出す。 $this->test(); } }
ルーティングを設定して、index()を表示させてください。
testと表示されれば継承ができています。
モデルを使いやすくする
MY_Controllerを修正する
MY_Contorller.phpにmodelの関数を追加しましょう。
class MY_Controller extends CI_Controller { /** * モデルを呼び出す * * @param string $name * @return */ public function model($name) { $name = $name . '_model'; if (!isset($this->{$name})) { $this->load->model($name); } return $this->{$name}; } }
モデルを作る
application/modelsに適当なモデルを作ります。
Sample_modelを作成し、中にtest()を作ってください。
※今回はモデルを呼び出せるか確認するだけなのでSQL文とかは省きます。
class Sample_model extends CI_Model { public function test() { print 'test'; } }
コントローラからモデルを呼び出す
Sampleコントローラにsample1()とsample2()を追加します。
sample1()ではモデルを通常の呼び方で実行しています。
sample2()ではMY_Controllerを使った呼び方で実行しています。
class Sample extends MY_Controller { /** * 普通にモデルを呼び出す。 */ public function sample1(){ $this->load->model('sample_model'); $this->demo_model->test(); } /** * MY_Contorllerのmodel関数を利用 */ public function sample2(){ /* @var $model Sample_model */ $model = $this->model('sample'); $model->test(); } }
$this->model(‘モデル名’);を実行するとmodelのインスタンスが返ってきます。
/* @var $model Sample_model */を書いておくと、$modelは何のクラスのインスタンスなのかをエディタが認識できるので、コード補完が簡単になります。