Laravelのマクロ定義のときに$thisまわりででるPhpStormの警告を黙らせる


はじめに

Laravelのいろいろなクラスに用意されているマクロは足りないメソッドをサブクラスを作らず直接追加する感じで使えてとても強力です。

実際に実行する関数の中身はPHPのクロージャーを使って与えるのですが、実行時には$thisをそのクラスに束縛しなおしているので、普通にそのクラスのメソッドで行えることは全部できます。private/protectedなメソッド/プロパティにもアクセスできます。

しかしPhpStormは束縛しなおされた$thisをうまく扱うことができないので、たくさん警告がでます。たとえば以前の記事「Eloquentでrelationのレコードの有無だけをサブクエリで取得したい」で定義したマクロはこんな感じになります。

黙らせる方法

いろいろ試して今使っている方法を紹介します。アイディアとしては「$thisの変化を指定できないのなら、マクロ定義を行うクラスに必要なメソッド/プロパティをannotationを駆使して生やしてしまえばいい」です。

@mixin

$thisが別のクラスなのがまず問題なので、@mixinを使ってマクロを定義するクラスを取り込みます。

/**
 * ......
 * @mixin Builder
 * /

これでpublicにアクセスできるプロパティやメソッドはokです。

@property@method

それでもprivate/protectedなプロパティやメソッドについての警告が出てしまいます。

これらを黙らせるには警告が出ているものについて@property@methodを追加してやります。

/**
 * ......
 * @property \Illuminate\Database\Query\Builder $query
 * @method parseWithRelations(array $relations)
 * @method selectExists($query, $as)
 */

欠点

@mixin,@property,@methodで追加したものは元のクラス(この場合はAppServiceProvider)には本来存在しませんが、補完候補などで出てくるようになってしまいます。

AppServiceProviderを呼び出すプログラムを自分で書くことはまずないので、この点については目をつぶっています。

おわりに

出るべきではない警告がたくさん残った状態だと、本当に問題のある警告がもしあっても埋もれてしまってよくありません。かなり無理矢理な方法ですが極力きれいな状態を保つことは意味があると思います。