[CekePHP5]Tableクラスのメソッド存在チェック

こちらの記事でコントローラーのメソッドの存在チェック方法について書きましたが、Tableクラスでメソッドが存在するか調べる方法についてはまた事情が違うようでした。

Tableクラスに実装したメソッドに関してはmethod_exists()で可能ですが、問題は動的にロードされるもの。
ビヘイビアに関してはオブジェクトを取得してmethod_exists()することで対応できます。
Tableクラスの中にhasBehavior()やgetBehavior()があるのでこんな感じでできます

if($table->hasBehavior('ビヘイビア名') && method_exists($table->getBehavior('ビヘイビア名'),'調べたいメソッド名') {
//メソッドあり
}

内部的には_behaviors->hasMethod()があるんですが、protectedだったので外から呼べないんですよね。これが呼べればメソッド名だけで存在チェックが可能なのですが・・・。
とはいえ、通常はビヘイビアがロードされているかだけを調べれば十分だと思います。
複数の同じメソッドを持つビヘイビアを実装することはほぼないと思いますので(というかやめたほうがいいですが)

ちなみにTable::validationMethodExists()で一発でできそうなのですがこれもprotected()なので、Tableを継承した独自のクラスを実装してこれを呼び出すのでも良さそうです。

リレーションテーブルに関しては、TableクラスにhasAssociation()やgetAssociation()があるので、これらを使って上記と同じようにテーブルがリレーションされているか調べたり、リレーション先のテーブルオブジェクトを取得してメソッドやビヘイビアの存在チェックが可能です。

タイトルとURLをコピーしました