LoginSignup
14
8

More than 5 years have passed since last update.

CakePHP3のComponentでloadModelする

Posted at

ComponentでloadModelが使いたい

Controllerではいつも意識せず$this->loadModel('modelName')を使っていたんですが、
Componentだとそれができず、仕方なく$this->modelName = new TableRegistry::get('modelName')と書いていました。

HogeComponent.php
<?php
namespace App\Controller\Component;

use Cake\Controller\Component;

class HogeComponent extends Component
{
    public function init()
    {
        $this->modelName = new TableRegistry::get('modelName'); // OK
        $this->loadModel('modelName'); // エラー
    }
}

でもloadModel使いたいなーと思ったので、ちょっと調べたメモを投稿しておきます。

loadModelの実装

そもそもloadModelって誰が実装しているメソッドなの?と言うところから調べてみたのですが、どうやらController.phpがuseしているModelAwareTraitが持っている様子。
Controller.phpはAppControllerの親なので、AppControllerを継承していれば、各Controllerで$this->loadModel('modelName')が呼べる、と言うことでした。

なので、ComponentでもModelAwareTraitをuseすれば使えるはず。

実際に書いてみた

HogeComponent.php
<?php
namespace App\Controller\Component;

use Cake\Controller\Component;
use Cake\Datasource\ModelAwareTrait;

class HogeComponent extends Component
{
    // loadModel()を使うために読み込む
    use ModelAwareTrait;

    public function init()
    {
        $this->modelName = new TableRegistry::get('modelName'); // OK
        $this->loadModel('modelName'); //OK
    }
}

と言うことで、ModelAwareTraitを読み込むだけでOKでした。

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8