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