Ожидаемый объект возвращен symfony - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь получить элемент из базы данных и передать его новому элементу в pu sh в базу данных.

$post = $entityManager->getRepository('App:Post')
            ->find($id);

$comment->setPost($post)

setPost выглядит следующим образом:

public function setPost(Post $post): self
    {
        $this->post = $post;

        return $this;
    }

и переменная $post:

 /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Post", inversedBy="comments")
     * @ORM\JoinColumn(nullable=false)
     */
    private $post;

Но когда я пытаюсь установить пост как setPost($post), это выдает мне следующую ошибку:

Ожидаемый параметр типа '\ App \ Entity \ Post', 'object' предоставлен

1 Ответ

1 голос
/ 19 апреля 2020

Я предполагаю, что ошибка, которую вы видите, связана с вашей интегрированной средой разработки (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!).

...