Open7

VSCodeでLaravelのEloquentの補完が効かないことについて

さすけさすけ

通常のPHPの補完については、「PHP Intelephense」の拡張機能を使えば補完が効く。
ただし、Laravelはファサードを使っているため補完が出ない部分がある。
それはbarryvdh/laravel-ide-helperを使えば大体出るようになる。

しかし、createなどの補完が出ない

さすけさすけ

それでも補完を出す方法はいくつかある

  1. query()メソッドを使う
  2. Modelの継承先をclass Post extends \Eloquentにする
  3. PHPDocsの@mixin \Eloquentを有効にする
さすけさすけ

query()メソッドを使う

一番良さそうな手だと思う

内部的には結果的に同じ処理を通ることになるから副作用については問題ないはず(Laravelの仕様が変わってなければ)

Eloquentの公式Twitterもquery()付けることのプチメリットみたいなこと言ってた気がするからどっち派?みたいなものだと思ってる(ソースはパッと探して出なかった。。。)

https://qiita.com/fujita-goq/items/2279bb947ec4e7b103b2

さすけさすけ

Modelの継承先をclass Post extends \Eloquentにする

内部的には\Illuminate\Database\Eloquent\Modelを継承しているから問題ないはずだけど、
詳しく把握しているわけでもないし、その副作用が分からないのでしっかり調べてから使おう

さすけさすけ

PHPDocsの@mixin \Eloquentを有効にする

ここが一番伝えたかったところ
PHPStorm使っている人は動いているっぽくて困ってた

結論、VSCodeのPHP Intelephenseは@mixin \Eloquentを検知してないみたい

v1.7.0からサポートしてるけど、プレミアムライセンスの人のみ
PHPStormはmixinが使えるから補完効くんじゃないかなと思ってる
(使ってないので推測だけど。。。)

サポートする意味も含めてお金を出す価値はあるけど、チームで開発するときにライセンス持ってない人がいたら辛いかも

実際に買った訳じゃないから、動くかどうかは未検証

参考

https://su-kun1899.hatenablog.com/entry/2022/07/02/210000
https://github.com/bmewburn/vscode-intelephense/issues/123
https://github.com/bmewburn/vscode-intelephense/issues/1789
https://github.com/bmewburn/vscode-intelephense/blob/master/CHANGELOG.md#170---2021-04-26

さすけさすけ

ガッツリ調べたわけじゃないから、推測が多め
だけど、こういう背景がありそうなので、困っている人のヒントになれば嬉しい

何を選択するかはその環境で合意を取って動こう

個人的なオススメはquery()を使うこと
コードが見通しやすくなるとかプチメリットも存在するし、何しろ手軽
ただしCRUD作ったくらいの視点なので、プロジェクトが進んでいくにつれて「やっぱり@mixin認識してくれないと。。。」みたいな場面に遭遇するかもしれないので、何とも言えない

他に方法あれば教えていただけると助かります!