5
3

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 5 years have passed since last update.

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

Posted at

はじめに

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

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

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

スクリーンショット 2018-10-30 15.48.25.png

黙らせる方法

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

@mixin

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

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

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

@property@method

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

スクリーンショット 2018-10-30 15.54.27.png

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

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

欠点

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

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

おわりに

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

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?