2015-04-03 6 views
10

Also fange ich gerade mit Laravel (mit v5) und Eloquent an. Ich arbeite einige grundlegende APIs up auf immer und läuft und zu bemerken, dass viele Arbeitsmethoden zeigen nicht in PhpStorm Code up HintingEloquenter ORM Code Hinting in PhpStorm

So habe ich dieses Modell:

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 { 
} 

Und in einem der meine Controller versuche ich

User::query()->orderBy('id', 'desc'); 

User::query() schafft eine Eloquent Builder Objekt und orderBy() verhalten sich korrekt und ohne Fehler zu machen. PhpStorm zeigt jedoch nicht orderBy() (oder take(), skip(), und ich bin sicher, andere) wenn ich User::query()-> tippe und Warnungen gibt, wenn ich es tatsächlich verwende.

Ich benutze Laravel IDE Helper, die enorm geholfen hat, Codehinweise zu den Fassaden zu bringen, aber nicht zu den Modellen/den Baumeistern, die es scheinen würde.

Hat jemand eine Lösung dafür?

+0

Haben Sie Bereiche für Projekt einrichten (innen PhpStorm)? – Kyslik

+0

@Kyslik Kannst du erklären, was du damit meinst? Das Projekt ist genau wie jedes andere Projekt, das ich je gemacht habe (wir haben Silex vor diesem Ausflug in Laravel benutzt). Alles andere funktioniert richtig, nur nicht diese wenigen Punkte auf den Modellen und Bauherren. –

+0

@JoshJanusch Ich habe das gleiche Problem, haben Sie eine Lösung gefunden? – Amitay

Antwort

3

Sie können versuchen, Laravel plug-in für PhpStorm und Sie müssen es in Ihren Projekteinstellungen aktivieren.

+2

Dies verbesserte auf jeden Fall einige Dinge (Routenerstellung, Konfigurationsinteraktion, einige zusätzliche Facade Hinting), aber es half leider nicht mit den Modellen. Danke für den Vorschlag. Dies wird definitiv hilfreich sein. –

34

Für zukünftige Googler und vielleicht auch OP, wenn Sie noch bei Laravel bleiben.

Das laravel-ide-helper Paket löst dieses Problem für Sie ziemlich elegant, mit, was ich glaube, ist ein relativ neues Merkmal; generierte Modell PHPDocs.

Sie können eine separate Datei für alle PHPDocs mit diesem Befehl erzeugen:

php artisan ide-helper:models 

Die erzeugte Metadaten werden so etwas wie dies für jede Klasse aussehen:

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 {} 
} 

Das ist für mich verursacht Probleme in PhpStorm Allerdings beschwerte sich die Software über mehrere Klassendefinitionen. Zum Glück ist eine Option, leicht zugänglich für die direkt an die Modell-Dateien zu schreiben:

php artisan ide-helper:models -W 

Es gibt ein paar mehr Optionen und Einstellungen zur Verfügung, wenn Sie das Verhalten optimieren müssen, aber das ist der Kern von ihm.

+0

Dies sollte die akzeptierte Antwort sein. – baris1892

3

Ein wenig spät, aber ich hatte vor kurzem das gleiche Problem, so dachte ich, ich würde eine Notiz hinstellen:

Dies liegt daran, Database\Eloquent\Model.php eine query() Funktion hat, die \Illuminate\Database\Eloquent\Builder zurückgibt und die Eloquent\Builder hat eine Linie:

use Illuminate\Database\Query\Builder as QueryBuilder; 

Dann verwendet es "magische" __call Methoden, um Funktionen in Query\Builder aufzurufen.(Suchen Sie nach __call Methode in Eloquent\Builder)

See: http://php.net/manual/en/language.oop5.overloading.php#object.call

__call() ausgelöst wird, wenn in einem Objektkontext unzugänglichen Methoden aufrufen.

So, in der Tat ist die Methode, die Sie aufrufen, nicht zugänglich :) Es gibt nicht viel, was die IDE tun kann.

Es gibt Problemumgehungen wie die Verwendung von @method Tags, aber es ist nicht zu warten. Eine Alternative ist die Verwendung von @mixin (dies basiert jedoch nicht auf Standards). Siehe: https://github.com/laravel/framework/issues/7558

Ich denke, das alles gelöst werden, wenn sie alle magische Anrufe in der Laravel-Code loswerden und stattdessen PHP 'Merkmale' verwenden. See last message here. :)

0

Ich wollte eine Art explizite "Casting" bei der Interaktion mit dem Abfrage-Generator haben.

/** 
* Explicit type-hinting 
* 
* @return static 
*/ 
static public function hint(BaseModel $model) 
{ 
    return $model; 
} 

Auf diese Weise: Beispiel ...

$user = User::query()->findOrFail($id); 
$user->myUserSpecialMethod(); // <-- IDE syntax error 

Da alle meine Modelle meine eigene Basis Modell erweitern, was wiederum Eloquent erstreckt, ich habe die Schaffung meiner benutzerdefinierten Basismodell dieser Methode in gelandet Es löst den IDE ungültigen Fehler und hilft mir:

$user = User::hint(User::query()->findOrFail($id)); 
$user->myUserSpecialMethod(); // <-- all OK ! 

Bitte beachten Sie, dass dies nicht OOP Typ Casting ist. Es ist nur ein Hinweis, um der IDE zu helfen. In meinem Beispiel war die zurückgegebene Model bereits eine User. Wenn ich diese Methode auf einer abgeleiteten Klasse wie SuperUser verwendet woud, nur wird das IDE täuschen ...

Eine schöne Alternative ist auch Meta-Informationen direkt über die Zuweisungsanweisung zu setzen:

/** @var User $user */ 
$user = User::query()->findOrFail($id); 
$user->myUserSpecialMethod(); // <-- all OK ! 

Oder nächste es ...

$user = User::query()->findOrFail($id); /** @var User $user */ 
$user->myUserSpecialMethod(); // <-- all OK ! 
0

hinzufügen in Modell PHPDoc @mixin

/** 
* Class News 
* @property int $id 
* @property string $created_at 
* @property string $updated_at 
* @mixin \Eloquent 
* @package App 
*/ 
class News extends Model 
{ 

} 

In PhpStorm

arbeitet oder in den \Illuminate\Database\Eloquent\Model

PHPDoc

/** 
    * @mixin \Eloquent 
    */ 
abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable 
...