ControllerからModelを使用する

Pocket

ControllerからModelを使用する場合には、まず使用するモデルのControllerのメンバに読み込む必要があります。読み込む方法には、Controller全体で利用する場合と局所的に利用する場合で2種類の方法があります。

Controller全体でModelを読み込む

Controller全体でModelを利用する方法です。こちらが一般的にな方法であり、記述も楽です。ただし、この方法を取る場合指定したControllerをインスタンス化した瞬間からModelを読み込みにいくのでDB接続が常に発生する事になります。

$uses = array(‘ModelName’);

例:FooControllerにてUser, Employeeという2つのModelを利用する場合。

class FooController extends AppController {
   public $uses = array('User', 'Employee');
}

Controller内で局所的にModelを読み込む

Controller内の特定の処理部分でのみModelを利用する方法です。この方法であれば、必要な時になって初めてModelを読み込む事によりメモリ使用量を抑えたりスピードを向上させる効果があります。それに、バグが介在した場合でも問題が派生する範囲を局所的にとどめる事ができます。

$this->loadModel(‘ModelName’);

例:FooController->index()アクション内でUserのModelを使用

class FooController extends AppController {
   public function index() {
      $this->loadModel('User');
   }
}

Controller内でModelを使用する

Controller内でModelを利用する場合は、上記の手順でまずModelを読み込む必要があります。読みこんだ後は単純にControllerのメンバオブジェクトとして利用できます。例えばModelからデータを取得したい場合はfind()関数が使えますので以下の様になります。

class FooController extends AppController {
   public function index() {
      $this->loadModel('User');
      $data = $this->User->find('all');
   }
}

 Controllerと同名のModelを読み込む

これまでModelを読み込んでから使用すると書いてきましたが、Controllerと同名のModelに限ってはCakePHPが自動的に読み込み処理を実行してくれるのであえて読み込み処理を記述する必要がありません。例えば、FooControllerからFooというModelを$usesや$this->loadModel()を使って読み込む必要がないわけです。

ですので、以下が成り立ちます。

class FooController extends AppController {
   public function index() {
      $data = $this->Foo->find('all');
   }
}

しかし気をつけなければならないのは、FooController::$usesに別のModelを記述してしまった場合には、デフォルトとしての同名Model読み込みをしません。この場合、明示的にFooを$usesに記述する必要があります。

class FooController extends AppController {
   public $uses = array('Foo', 'User');
   public function index() {
      $data = $this->Foo->find('all');
   }
}

 

 

記事が役に立ったらぜひシェアをお願いします。

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *