PHPカンファレンス2021でPHPStormがジェネリクス対応したと聞いて。
(追記)エンティティ版はこちら
課題
通常CakePHPではテーブルオブジェクトをTableRegistry経由で取得するが、これだと型はCake\ORM\Table型としか分からない。
$articles = TableRegistry::getTableLocator()->get('Articles'); //Cake\ORM\Table型とIDEに認識される
実際にはメソッド等を定義している具体的なArticlesTable型として認識してほしい。
Lean controllerだFat modelだと綺麗にしたいのにこれではIDE補完が使えない。
かと言って毎度@var
を書くのも間抜けすぎる。
世界中のCakePHPユーザーが同じことで困ってそうだがなぜか解決策が見つけられなかった。
解決策
ということで、ジェネリクスを使用した回避策がこれ。
use Cake\ORM\TableRegistry;
/**
* @template T
* @param class-string<T> $fullTableName 完全修飾テーブル名
* @return T of \Cake\ORM\Table
*/
public static function getTable(string $fullTableName)
{
return TableRegistry::getTableLocator()->get($fullTableName);
}
使用例
$articles = getTable('\App\Model\Table\ArticlesTable');
または
$articles = getTable(\App\Model\Table\ArticlesTable::class);
または
use \App\Model\Table\ArticlesTable;
$articles = getTable(ArticlesTable::class);
いずれも\App\Model\Table\ArticlesTable型としてIDEに認識される
留意事項
ジェネリクスを使う都合上、普通のTableLocatorのように単にgetTable('Articles')と書くことはできず、完全修飾名で指定する必要がある。
使用例の真ん中の書き方であればIDE補完付きで書くことができるのでそれほど手間ではない。