Добро пожаловать в StackOverflow!
Во-первых, когда вы вызываете getRepository()
, вы должны передать класс сущности, а не сам репозиторий, поэтому это будет выглядеть так:
$this->getDoctrine()->getRepository(Checklist::class);
Даже если вы это сделаете, ваша IDE не будет знать, что метод существует. Ваша IDE на самом деле неверна, метод действительно существует, ваша IDE просто не может узнать, какой объект был возвращен из вызова getRepository()
.
Как этого избежать? Выберите одно из этих решений (все они работают в PhpStorm, вариант 1 должен работать везде, вариант 2, вероятно, будет работать во всех современных IDE, я не знаю о поддержке варианта 3 в других IDE):
Вариант 1: внедрить его как услугу
public function myControllerRoute(ChecklistRepository $checklistRepository) {
// now your IDE knows what methods are inside the $checklistRepository
$items = $checklistRepository->getAllItemsForChecklist();
}
Вариант 2: введите его в IDE (и другие разработчики)
public function myControllerRoute() {
/** @var ChecklistRepository $checklistRepository */
$checklistRepository = $this->getDoctrine()->getRepository(Checklist::class);
// after the typehint the IDE knows what type it is
$items = $checklistRepository->getAllItemsForChecklist();
}
Вариант 3: использовать подтверждения
public function myControllerRoute() {
$checklistRepository = $this->getDoctrine()->getRepository(Checklist::class);
assert($checklistRepository instanceof ChecklistRepository);
// after the assert the IDE knows what type it is
$items = $checklistRepository->getAllItemsForChecklist();
}
Варианты 2 и 3 в значительной степени совпадают, но у варианта 3 есть дополнительный бонус, который на машине разработчика выдает исключение, если $checklistRepository
не является экземпляром ChecklistRepository
, в производственной среде вызовы assert()
игнорируются и вообще не замедляйте выполнение.