CodeIgniterで動的にModelを読み込む方法

2011 年 12 月 29 日
CodeIgniterでは、Controller内で
$this->load->model('Sample');
とすると、application/models/sample.phpに記述した"Sample"クラスが読み込まれます。 Sampleクラス内のメソッドをController内で実行させる場合、
$this->Sample->function();
と記述します。

通常はこれだけで問題がないわけですが、では例えば次のような条件を全て満たす仕組みはどのようにして実現するのでしょうか?
  • Controller内のパラメータで読み込むModelを切り替える
  • Controller内にはModel名をハードコードしない
  • Modelはapplication/modelsディレクトリ内に設置したファイルにのみ記述する

対象のModel名が動的に切り替わるということは、上記例のように"Sample"を静的に記述できないということになります。Modelの呼び出しについては
$modelname='Hogehoge'; $this->load->model($modelname);
とすることができます。
しかし、このままではメソッドの呼び出しができません。

このような場合に、非常に単純な解決策があります。
ユーザーガイドの「Models」>「Loading a Model」に、このような例が紹介されています。
http://codeigniter.com/user_guide/general/models.html
$this->load->model('Model_name', 'fubar'); $this->fubar->function();

第2引数を渡すと、その文字列をモデル名として使用できるのでした。
この例だけ見るとモデルをリネームする機能のようにしか見えないわけですが、この方法を先ほどの例とミックスさせると、第1引数を動的に渡しても第2引数のクラス名で固定できるのです。
$modelname='Hogehoge'; $this->load->model($modelname, 'fubar'); $this->fubar->function();

と、この方法で、Modelは動的に(ファイルごと)切り替えることが可能となります。

コメントをどうぞ