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
を呼び出すプログラムを自分で書くことはまずないので、この点については目をつぶっています。
おわりに
出るべきではない警告がたくさん残った状態だと、本当に問題のある警告がもしあっても埋もれてしまってよくありません。かなり無理矢理な方法ですが極力きれいな状態を保つことは意味があると思います。
Author And Source
この問題について(Laravelのマクロ定義のときに$thisまわりででるPhpStormの警告を黙らせる), 我々は、より多くの情報をここで見つけました https://qiita.com/crhg/items/45c0cf569944c3b62af7著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .