FragePHP Type Hinting Implementierung der abstrakten Methode - Repository Pattern
Ist es möglich, Zeile Code-Vervollständigung innerhalb PhpStorm mit einem Modell/Repository-Muster zu bekommen?
Mein Setup
ich Laravel verwende und das Repository-Muster zur Durchführung der in einem Laracasts Video beschrieben.
Der Kodex
Hier ist ein einfaches Beispiel, wie Modelle innerhalb Laravel arbeiten und wie es scheint unmöglich, Code-Vervollständigung zu erhalten für Modellattribute.
Dieser Code funktioniert und druckt "billy" aus, wie es sollte, jedoch ist das Attribut $ name nicht typisiert und wird in PhpStorm nicht mit Code vervollständigt. Der Typhinweis priorisiert den übergeordneten Attributdefinitionstyp und nicht das Kind, was mir seltsam vorkommt.
<?php
// Models
abstract class Model {
public $sqlTableName;
public function findFromDatabase($id)
{
$model = new $this;
// This would be grabbed using table name and $id
$fakeDatabaseRow = ['name' => 'billy', 'job' => 'engineer'];
foreach ($fakeDatabaseRow as $column => $value) {
$model->$column = $value;
}
return $model;
}
}
class User extends Model {
public $name;
public $job;
public $sqlTableName = 'users';
}
// Repositories
abstract class RepositoryBase {
/**
* @var Model
*/
public $model;
public function find($id)
{
$this->model = $this->model->findFromDatabase(1);
return $this->model;
}
}
class UserRepository extends RepositoryBase {
/**
* @var User
*/
public $model;
public function __construct(User $model)
{
$this->model = $model;
}
}
// Run
$model = new User();
$userRepository = new UserRepository($model);
echo $userRepository->find(1)->name;
eine hässliche Fix
Der einzige tatsächlich Code-Vervollständigung zu bekommen scheint das Kind Funktion mit einem neuen PHP-doc Block neu zu definieren zu sein:
class UserRepository extends RepositoryBase {
/**
* @var User
*/
public $model;
public function __construct(User $model)
{
$this->model = $model;
}
// I need to replace this function for every different repository
// even though they are all the same
/**
* @param $id
* @return User
*/
public function find($id)
{
return parent::find($id);
}
}
Ich habe jedoch Hunderte von Modellen, Repositories und Repository-Funktionen. Es wäre eine gewaltige Aufgabe, alle Funktionen in jeder Implementierung neu zu schreiben.
Gibt es eine Möglichkeit, PhpStorm dazu zu bringen, die Typhinweisdeklaration des Kinds statt der Eltern zu verwenden, ohne die Methode erneut deklarieren zu müssen?
Probieren Sie @ @ Methode in PHPDoc für die Klasse. – LazyOne
@LazyOne - Das funktioniert, wenn ich '@method User find ($ id)' zum UserRepository Docblock hinzufüge. Das bedeutet aber immer noch, dass ich dies für jedes Repository und für jede Funktion, die ein Modell zurückgibt, tun müsste. – magnito
'¯ \\ _ (ツ) _/¯' 1) zumindest du deklarierst es nicht neu 2) Ich kenne keinen anderen Weg 3) vielleicht kann das Laravel Support-Plugin dies tun (falls du es noch nicht installiert hast)) – LazyOne