CodeIgniter3のコアクラスを作ってコントローラを使いやすくする

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は何のクラスのインスタンスなのかをエディタが認識できるので、コード補完が簡単になります。