CakePHPにはプラグイン機能があって、機能を追加する際もやりやすいのですが、状況によってはそのまま追加するとうまくいかないことがあります。
プラグイン付属のテーブル
プラグイン内部でデータベースを扱う場合に、Table
クラスを自分で定義することもありますが、中には添付してあることもあります。
自分で作るのであれば、もちろん好きなように構築できます。一方、最初から付いている場合、設定なしで使えるのは便利ですが、テーブルに手を入れようとすると少し面倒なことになります。
ここでは以下のような例を考えてみます。
プラグイン名: Jkr2255/SomePlugin
Tableクラス: Jkr2255\SomePlugin\Model\Table\ItemsTable
Tableクラスロード時の名称: Jkr2255/SomePlugin.Items
差し替え用Tableクラスの用意
すでにTable
クラスがある場合、それを継承して必要な処理だけ組み込んでしまうのが手っ取り早いです。App\Model\Table
にでも作っておきましょう。なお、何もしなければ基底クラスが同じ名前になるので、as
で改名しておいたほうがいいでしょう。
<?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
の先頭あたりで行ったほうがいいでしょう。
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
を返すようになります。