Я предполагаю, что ошибка, которую вы видите, связана с вашей интегрированной средой разработки (IDE), например, eclipse, vs code, phpstorm и другими. Но код - при фактическом выполнении - должен работать.
Теперь ошибка, скорее всего, связана с анализом кода stati c, выполняющимся в фоновом режиме упомянутой среды IDE, который просматривает оператор и пытается проанализировать согласно названным методам, доступны свойства et c. какого типа ваши переменные.
Итак, давайте сделаем это медленно (и вы, вероятно, можете навести курсор на $vars
и ->methods()
проверить). Строка, в которой я заинтересован -
$post = $entityManager->getRepository('App:Post')
->find($id);
поэтому $entityManager
имеет тип EntityManagerInterface
, который имеет метод getRepository
с одним обязательным параметром типа string
('App:Post'
в вашем случае), и он вернет объект типа ObjectRepository
, у которого есть метод find
, который требует один параметр (mixed
, не спрашивайте) и возвращает ?object
, что означает object
или null
. Таким образом, $post
имеет тип object
(в лучшем случае, или ноль, в этом случае произойдет сбой!). Теперь следующая строка явно ожидает параметр типа Post
, а не типа object
, таким образом, предупреждение / уведомление / ошибка.
Теперь, stati c Анализ кода весьма полезен до определенного уровня, но он не является непогрешимым, поскольку имеет ограничения. Он не знает, что время выполнения на самом деле вернет, это просто предполагает, что подсказки типа, найденные в коде (из doctrine), в достаточной мере указывают c - чего в них нет ваш случай.
легкое исправление
добавьте строку do c, чтобы сообщить stati c коду анализа, какой тип переменной $post
на самом деле является:
/** @var Post $post */
$post = $entityManager->getRepository('App:Post')
->find($id);
это явно указывает инструменту анализа stati c, что $post
имеет тип Post
, возможно, вам придется написать App\Entity\Post
или даже \App\Entity\Post
.
hard fix
В качестве альтернативы, вы можете реализовать свою собственную PostRepository
(doctrine предоставляет некоторую справку) и определить функцию, подобную function findById($id) :Post
- которая явно сообщит stati c анализу кода, что тип возвращаемого значения - когда вы вызываете его в своем коде (внедряется в вашу функцию через внедрение зависимостей: PostRepostory $postRepository
):
$post = $postRepository->findById($id);
Если вы используете множество разных сущностей, это очень Подробное решение, но в зависимости от вашего проекта оно может стоить того, поскольку вы явно указываете зависимости, а не вводите очень неопределенный c (как мы видели) EntityManagerInterface
. Использование EntityManagerInterface может привести к тестированию АД (imho!).