DomandaPHP Tipo Hinting Attuazione del metodo astratto - Pattern Repository
E 'possibile ottenere il completamento del codice fila all'interno PhpStorm utilizzando un modello/modello repository?
mio Setup
Sto usando laravel e attuazione del modello di repository, come descritto in un video Laracasts.
Il Codice
Ecco un esempio di base di come i modelli funzionano all'interno laravel e come sembra impossibile per ottenere il completamento del codice per gli attributi del modello.
Questo codice funziona e stampa "billy" come dovrebbe, tuttavia l'attributo $ name non è di tipo suggerito e non verrà completato dal codice all'interno di PhpStorm. Il tipo di suggerimento sta dando la priorità al tipo di definizione dell'attributo padre piuttosto che al bambino, il che mi sembra strano.
<?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;
una correzione Ugly
L'unico realmente per ottenere il completamento del codice sembra essere a ri-definire la funzione bambino con un nuovo blocco php doc:
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);
}
}
Tuttavia ho centinaia di modelli, repository e funzioni di repository. Sarebbe un enorme lavoro riscrivere tutte le funzioni all'interno di ciascuna implementazione.
C'è un modo per far sì che PhpStorm usi la dichiarazione di tipo hint del bambino piuttosto che i genitori senza dover ripetere il metodo?
Prova '@ method' in PHPDoc per la classe. – LazyOne
@LazyOne - Funziona se aggiungo '@method User find ($ id)' al docblock UserRepository. Tuttavia, ciò significa che avrei bisogno di farlo per ogni repository e per ogni funzione che restituisce un modello. – magnito
'¯ \\ _ (ツ) _/¯' 1) almeno non lo dichiari nuovamente 2) Non conosco altro modo 3) forse il plugin di supporto di Laravel può farlo (nel caso non lo avessi ancora installato) – LazyOne