web-dev-qa-db-ja.com

PhpStormでの雄弁なORMコードのヒント

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にもたらすのに非常に役立ちましたが、モデル/ビルダーには見えません。

誰かがこれに対する解決策を持っていますか?

26
Josh Janusch

将来の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

動作を微調整する必要がある場合は、さらにいくつかのオプションと設定を使用できますが、これがその要点です。

68
Erik Johansson

モデルに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'を使用します。 ここで最後のメッセージを参照してください。 :)

4
Evren Yurtesen

PhpStormに対して Laravelプラグイン を試すことができ、プロジェクト設定で具体的にアクティブ化する必要があります。

3
mirza

BarryVHDの Laravel IDE Helper パッケージを使用している場合は、次のコマンドを実行します。

php artisan ide-helper:eloquent

これにより、/** @mixin \Eloquent */vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.phpファイルに書き込まれます。

2
GTCrais

クエリビルダーとやり取りするときに、ある種の明示的な "キャスト"が必要でした。例...

$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 !
1
Isometriq