Файл метаданных PhpStorm для классов репозитория - PullRequest
0 голосов
/ 11 мая 2018

В нашем приложении мы используем репозитории для моделей, которые выбираются из базы данных.Итак, у нас есть абстрактный репозиторий, который знает о базе данных, имеет метод loadById для загрузки записи базы данных и абстрактный метод getEntity, который создает объект для этого конкретного репозитория.Пример кода:

abstract class EntityRepository {
  /**
   * @param int $id
   * @return AbstractEntity
   */
  public function loadById($id) {
    $record = $this->db->loadById($id);
    $entity = $this->getEntity();
    return $this->inflate($record, $entity);
  }

  /**
   * @return AbstractEntity
   */
  protected abstract function getEntity();
}

class PeopleRepository extends EntityRepository {
  protected function getEntity() {
    return new PeopleEntity();
  }
}

abstract class AbstractEntity {
  private $id;

  /**
   * @return int
   */
  public function getId() {
    return $this->id;
  }

  /**
   * @param int $id;
   */
  public function setId($id) {
    $this->id = $id;
  }
}

class PeopleEntity extends AbstractEntity {
  private $name;

  /**
   * @return string
   */
  public function getName() {
    return $this->name;
  }

  /**
   * @param string $name;
   */
  public function setName($name) {
    $this->name= $name;
  }
}

При использовании экземпляра PeopleRepository и получении модели через loadById PhpStorm не может разрешить возвращенную модель в конкретный тип, но обеспечивает только завершение кода дляфункции AbstractEntity.Есть ли какой-нибудь простой способ заставить его работать?

В https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata, Я нашел только способы заставить его работать для конкретных классов и их функций.Таким образом, перечисление всех классов репозитория и всех способов их создания может работать.Но я бы хотел увидеть абстрактный способ определения типа «Все экземпляры EntityRepository будут возвращать сущность того типа, определенного в getEntity() при загрузке сущности»

1 Ответ

0 голосов
/ 11 мая 2018

Я сомневаюсь, что есть общий способ сделать это. Даже с использованием мета PHPStorm вы должны быть явными для каждого случая. Возможно, это можно сделать, добавив фасад хранилища, например,

class RepositoryFacade {
     public static function __callStatic($method, $args) {
          if ($args[0] == People::class) {
              array_shift($args);
              return new PeopleRepository()->{$method}(...$args); 
          }
     }
}

Тогда вы можете напечатать это, используя:

override(RepositoryFacade::loadById(0), type(0));

Конечно, фасад не совсем лучший образец для использования в целом, поэтому я понимаю, что это не может быть идеальным.

...