Laravel(v5を使用)とEloquentで始めます。いくつかの基本的なAPIを起動して実行し、多くの機能するメソッドが表示されないことに気付いていますPhpStormのコードヒント
だから私はこのモデルを持っています:
_namespace Project\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
class User extends Model
implements AuthenticatableContract, CanResetPasswordContract {
}
_
そして、私のコントローラーの1つで、
_User::query()->orderBy('id', 'desc');
_
User::query()
はEloquent Builder
オブジェクトを作成し、orderBy()
はエラーなしで適切に動作します。ただし、PhpStormはorderBy()
を入力してtake()
(またはskip()
、User::query()->
、および他のものと確信しています)を表示して実際に使用する際の警告。
私は Laravel IDE Helper を使用しています。これは、コードヒントをFacadeにもたらすのに非常に役立ちましたが、モデル/ビルダーには見えません。
誰かがこれに対する解決策を持っていますか?
将来のGoogle社員向けです。Laravelを引き続き使用する場合は、おそらくOPも同様です。
laravel-ide-helper パッケージは、この問題を非常にエレガントに解決します。私が信じているのは、比較的新しい機能です。生成されたモデルのPHPDocs。
次のコマンドを使用して、すべてのPHPDocsに個別のファイルを生成できます。
php artisan ide-helper:models
生成されたメタデータは、クラスごとに次のようになります。
namespace App {
/**
* App\Post
*
* @property integer $id
* @property integer $author_id
* @property string $title
* @property string $text
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property-read \User $author
* @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
*/
class Post {}
}
しかし、これはPHPStormで私に問題を引き起こし、ソフトウェアは複数のクラス定義について不平を言っていました。幸い、モデルファイルに直接書き込むためのオプションが用意されています。
php artisan ide-helper:models -W
動作を微調整する必要がある場合は、さらにいくつかのオプションと設定を使用できますが、これがその要点です。
モデルにPHPDoc@mixin
を追加します
/**
* Class News
* @property int $id
* @property string $created_at
* @property string $updated_at
* @mixin \Eloquent
* @package App
*/
class News extends Model
{
}
PHPStormで動作します
または\Illuminate\Database\Eloquent\Model
に追加
PHPDoc
/**
* @mixin \Eloquent
*/
abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable
...
少し遅れましたが、最近同じ問題が発生したため、メモを書き留めておきます。
これは、_Database\Eloquent\Model.php
_に_\Illuminate\Database\Eloquent\Builder
_を返すquery()
関数があり、_Eloquent\Builder
_に次の行があるためです。
_use Illuminate\Database\Query\Builder as QueryBuilder;
_
次に、「マジック」の__callメソッドを使用して_Query\Builder
_の関数を呼び出します。 (___call
_で_Eloquent\Builder
_メソッドを探します)
参照: http://php.net/manual/en/language.oop5.overloading.php#object.call
__call()は、オブジェクトコンテキストでアクセスできないメソッドを呼び出すとトリガーされます。
したがって、実際に呼び出すメソッドにはアクセスできません:) IDEで実行できることはそれほど多くありません。
@methodタグを使用するなどの回避策がありますが、メンテナンスできません。代わりの方法は@mixinを使用することです(ただし、これは標準ベースではありません)。参照: https://github.com/laravel/framework/issues/7558
Laravelコード内のすべての魔法の呼び出しを取り除き、代わりにPHP 'traits'を使用します。 ここで最後のメッセージを参照してください。 :)
PhpStormに対して Laravelプラグイン を試すことができ、プロジェクト設定で具体的にアクティブ化する必要があります。
BarryVHDの Laravel IDE Helper パッケージを使用している場合は、次のコマンドを実行します。
php artisan ide-helper:eloquent
これにより、/** @mixin \Eloquent */
がvendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php
ファイルに書き込まれます。
クエリビルダーとやり取りするときに、ある種の明示的な "キャスト"が必要でした。例...
$user = User::query()->findOrFail($id);
$user->myUserSpecialMethod(); // <-- IDE syntax error
私のすべてのモデルはEloquentを拡張するカスタムベースモデルを拡張しているので、カスタムベースモデルでこのメソッドを作成することになりました。
/**
* Explicit type-hinting
*
* @return static
*/
static public function hint(BaseModel $model)
{
return $model;
}
このようにして、IDE invalidエラーを解決し、私を助けます:
$user = User::hint(User::query()->findOrFail($id));
$user->myUserSpecialMethod(); // <-- all OK !
これはOOP型キャストではないことに注意してください。これはIDEを支援するためのヒントにすぎません。私の例では、返されたModel
はすでにUser
でした。SuperUser
のような派生クラスでこのメソッドを使用すると、IDEのみがだまされます...
ニースの代替手段は、割り当てステートメントの上に直接メタ情報を置くことです:
/** @var User $user */
$user = User::query()->findOrFail($id);
$user->myUserSpecialMethod(); // <-- all OK !
またはその隣に...
$user = User::query()->findOrFail($id); /** @var User $user */
$user->myUserSpecialMethod(); // <-- all OK !