2行結論
CakePHP は OK
Laravel は blade ディレクティブ使ってると難しい
CakePHP
vscode で開発していて、テンプレート側でも何とか型補完出来ないかしばらくの間試行錯誤していましたが、 CakePHP ではようやく解決したのでメモ
恥ずかしい話 @var でも変数名を指定できるのを今まで知りませんでした…
言い訳になりますがプロパティ定義時とか変数への代入時とかでしか使ってなかったので
サンプルコード
index.ctp (v3)、 index.php (v4)
<?php
/**
* @var \App\Model\Entity\User $user
*/
?>
<!-- User Entity として型補完が効く -->
<?php if ($user->isAdmin()) ?>
<!-- 省略 -->
<?php endif ?>
試行錯誤して駄目だった例
このパターンの記述は変数への代入やプロパティ定義でないと駄目なんですね
<?php
/** @var \App\Model\Entity\User */
if ($user->isAdmin())
?>
<!-- 省略 -->
<?php endif ?>
<?php
/** @var \App\Model\Entity\User */
$user
?>
<?php if ($user->isAdmin()) ?>
<!-- 省略 -->
<?php endif ?>
Laravel
Laravel では blade ディレクティブに渡される変数などは型補完出来ませんでした
PHPの構文ではないので当然っちゃ当然ですが
補完が効かないサンプルコード
{{- <?php でも同様 -}}
@php
/**
* @var \App\Models\User $user
*/
@endphp
{{– 型補完が効かない –}}
@if ($user->isAdmin())
{{– 省略 –}}
@endif
一応 blade ディレクティブを使用せず CakePHP と同じ書き方なら補完効きましたが…
<?php
/**
* @var \App\Models\User $user
*/
?>
{{- User モデル として型補完が効くが blade を使う意味を問われる -}}
<?php if ($user->isAdmin()) ?>
{{– 省略 –}}
<?php endif ?>
補完してくれる拡張機能も探しましたが見つかりませんでした
PHPStorm だと2017年には対応してますね。うらやましいことです