4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[CakePHP] 型情報付きでテーブルオブジェクトを取得する

Last updated at Posted at 2021-10-06

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補完付きで書くことができるのでそれほど手間ではない。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?