LoginSignup
2
1

More than 5 years have passed since last update.

CakePHP3で、プラグイン付属のTableクラスを差し替える

Posted at

CakePHPにはプラグイン機能があって、機能を追加する際もやりやすいのですが、状況によってはそのまま追加するとうまくいかないことがあります。

プラグイン付属のテーブル

プラグイン内部でデータベースを扱う場合に、Tableクラスを自分で定義することもありますが、中には添付してあることもあります。

自分で作るのであれば、もちろん好きなように構築できます。一方、最初から付いている場合、設定なしで使えるのは便利ですが、テーブルに手を入れようとすると少し面倒なことになります。

ここでは以下のような例を考えてみます。

プラグイン名: Jkr2255/SomePlugin
Tableクラス: Jkr2255\SomePlugin\Model\Table\ItemsTable
Tableクラスロード時の名称: Jkr2255/SomePlugin.Items

差し替え用Tableクラスの用意

すでにTableクラスがある場合、それを継承して必要な処理だけ組み込んでしまうのが手っ取り早いです。App\Model\Tableにでも作っておきましょう。なお、何もしなければ基底クラスが同じ名前になるので、asで改名しておいたほうがいいでしょう。

src/Model/Table/ItemsTable.php
<?php

namespace App\Model\Table;

use Jkr2255\SomePlugin\Model\Table\ItemsTable as BaseItemsTable;

class ItemsTable extends BaseItemsTable
{
  // 上書きする内容は省略
}

TableRegistryの差し替え

TableRegistry::getはよく使うと思いますが、TableRegistryには他にもメソッドがあります。今回は、TableRegistry::configureを使います。

これは、特定の名前に対して対応するクラスを定義するものですが、1つ制約がありまして、「一度Tableクラスがロードされてしまった後には書き換えできない」ということです。もちろんあとからクラスが変わってしまうとうまく動かなくなるからある制約ですが、これを考えれば差し替えはAppController#initializeの先頭あたりで行ったほうがいいでしょう。

app/Controller/AppController.php
public function initialize()
{
    TableRegistry::configure('Jkr2255/SomePlugin.Items', [
        'className' => 'App\Model\Table\ItemsTable'
    ]);

    // 後略
}

これを行うことで、TableRegistry::get('Jkr2255/SomePlugin.Items')やコントローラー内からの$this->loadModel('Jkr2255/SomePlugin.Items')に、自作のApp\Model\Table\ItemsTableを返すようになります。

2
1
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
2
1