Help us understand the problem. What is going on with this article?

[CakePHP3]cookbookにはあまり書かれてない便利なトレイト

More than 1 year has passed since last update.

cookbookにはあまり書かれていませんがCakePHPには独自クラスを作成する上で便利なトレイトがあります。
Cakeにあるトレイトを独自クラスにも使うことで、よりCakeらしいクラスを作ることが出来るので全体の統一感が増し、さらにコードを書く量も減らすことが出来るのでオススメです :kissing_heart:

対象

この記事はCakePHP3.6で確認しています

InstanceConfigTrait

コンフィグを扱うためのトレイト。
ビヘイビア、Viewヘルパー、コンポーネントなどに使用されています。

使用することで他のCakeと同じようにコンフィグを使うことができます。

サンプル :

<?php

namespace App\Lib;

use Cake\Core\InstanceConfigTrait;

class Sample
{
    use InstanceConfigTrait;

    protected $_defaultConfig = [
        'max' => 5,
    ];

    public function __construct(array $config = [])
    {
        $this->setConfig($config);
    }

    public function valid($v)
    {
        return $v < $this->getConfig('max');
    }
}
$sample = new Sample();
$sample->setConfig(['max' => 10]);

ModelAwareTrait

モデルをロードするためのトレイト。
コントローラー、Shellなどに使用されています。

ビジネスロジックなどを扱う独自クラスを作るときなどに使うことが多いと思います。

サンプル :

<?php

namespace App\Lib;

use App\Model\Table\PagesTable;
use Cake\Datasource\ModelAwareTrait;

/**
 * @property PagesTable Pages
 */
class Sample
{
    use ModelAwareTrait;

    public function __construct()
    {
        $this->loadModel('Pages');
    }

    public function valid()
    {
        $pages = $this->Pages->find('all');
    }
}

ModelAwareTraitを使わなくても以下のようにも出来ますが、ユニットテストでモデルのモックを作るときに難しくなってしまうのでオススメしません。

    public function valid()
    {
        $pagesTable = TableRegistry::getTableLocator()->get('Pages');
        $pages = $pagesTable->find('all');
    }

このように書くようになったら loadModel のほうがシンプルです :wink:

    public function __construct()
    {
        $this->Pages = TableRegistry::getTableLocator()->get('Pages');
    }

LogTrait

ログを記録するためのトレイト。
コントローラなどのたくさんのクラスに使用されてます。

Cakeのクラスにはほぼ存在するので使っておくと他のクラスとの統一感が出ていいと思います。

サンプル :

<?php

namespace App\Lib;

use Cake\Log\LogTrait;

class Sample
{
    use LogTrait;

    public function valid()
    {
        $this->log('error!!!');
    }
}
mosaxiv
(ง ´・ω・`)ว
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away