【问题标题】:Repository (Doctrine\ORM\EntityRepository) does not accept Doctrine\Persistence\ObjectRepositoryRepository (Doctrine\ORM\EntityRepository) 不接受 Doctrine\Persistence\ObjectRepository
【发布时间】:2020-06-27 20:33:28
【问题描述】:

在将教义/持久性从 1.0 升级到 1.3 时,我遇到了静态代码分析问题。

Repository (Doctrine\ORM\EntityRepository) does not accept                    
         Doctrine\Persistence\ObjectRepository.     

问题出在这个

<?php
declare(strict_types=1);

namespace Appbundle\Repository\Company;

class CompanyRepository
{
    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    /**
     * @var EntityRepository
     */
    private $entityRepository;

    /**
     * @var ProfileRepository
     */
    private $profileRepository;

    public function __construct(
        EntityManagerInterface $entityManager,
    ) {
        $this->entityManager = $entityManager;
        $this->entityRepository = $entityManager->getRepository(Company::class);
    }

代码作为 getRepository reuturns EntityRepository,但 getReposiry 的返回类型是 ObjectRepository 并且不兼容。 使用 1.0 版。有人知道它可能是什么吗?

【问题讨论】:

  • 你有什么版本的 PHPStan 和 phpstan-doctrine?

标签: doctrine-orm doctrine phpstan


【解决方案1】:

这个错误是正确的。 EntityManagerInterfaceObjectManager接口继承getRepository方法,其中ObjectRepository is typehinted

因此您不能依赖从方法返回的EntityRepository,因为实现可以选择只返回ObjectRepository

您可能应该输入其他内容,例如 EntityManager

【讨论】:

  • EntityManager 和 EntityRepository 是两个完全不同的东西。我发现这是一个知道但这是在 Doctrine/Persistence 版本 1.3 中完成的
  • 我的意思是你应该输入提示 EntityManager 而不是 EntityManagerInterface。
  • 有趣的事情。 EntityManager 不接受 EntityManagerInterface。例如。 (Doctrine\ORM\EntityManager) 不接受 Doctrine\ORM\EntityManagerInterface。
  • 是的,这是有道理的。我在任何地方都使用Doctrine\ORM\EntityManager,它可以工作。
【解决方案2】:

好吧,我发现这是由于 Doctrine 更改了命名空间。这是一个报告的错误。

https://github.com/doctrine/orm/pull/7997 https://github.com/doctrine/orm/pull/7953

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 2012-07-05
    • 1970-01-01
    • 2022-06-30
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多