首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPStan不使用自定义实体存储库

PHPStan不使用自定义实体存储库
EN

Stack Overflow用户
提问于 2022-03-21 15:45:16
回答 1查看 631关注 0票数 0

我使用的是PHPStan及其理论扩展。

我有一个名为App\Repository\Doctrine\UserRepository的定制实体存储库,它带有@extends文档块:

代码语言:javascript
复制
/**
 * @extends \Doctrine\ORM\EntityRepository<\App\Entity\User>
 */
class UserRepository extends EntityRepository implements IUserRepository
{
    public function customRepositoryMethod()
    {
        // ...
    }
}

在控制器中,此代码:

代码语言:javascript
复制
    public function getUserMatches(EntityManager $em)
    {
        $userRepo = $em->getRepository(\App\Entity\User::class);
        $userRepo->customRepositoryMethod();
    }

...results在此PHPStan错误中:

代码语言:javascript
复制
Call to an undefined method Doctrine\ORM\EntityRepository<meQ\Entity\User>::customRepositoryMethod().

多亏了phpstan理论,静态分析知道$em->getRepository(User::class)返回一个EntityRepository<User>

但是,它不知道如何将自定义存储库类UserRepository作为该泛型类型的实现。

如何DocBlock UserRepository类,或以其他方式配置PHPStan,以便将UserRepository解释为EntityRepository<User>的实现

我还试过什么

我也尝试过这个DocBlock on UserRepository,但没有结果:

代码语言:javascript
复制
/**
 * @implements \Doctrine\ORM\EntityRepository<\App\Entity\User>
 */
EN

回答 1

Stack Overflow用户

发布于 2022-03-21 15:56:55

PhpStan无法知道EntityManager::getRepository()将返回您的自定义方法。

要么在那里添加一个@var注释:

代码语言:javascript
复制
/** @var UserRepository $userRepo */
$userRepo = $em->getRepository(\App\Entity\User::class);

或者更好的是,只需注入UserRepository,而不是整个EntityManager

代码语言:javascript
复制
public function getUserMatches(UserRepository $userRepository)
{
   $userRepository->customRepositoryMethod();
}

以上内容将适用于PhpStan或任何现成的静态分析工具。(,注入特定的存储库,而不是实体管理器在任何情况下都是更好的做法)。

但如果不是,您可以尝试安装PHPStan的理论扩展,这可能有助于工具理解代码基与Doctrine的关系。

如果您已经在使用Doctrine扩展,请注意,从我在文档中收集的内容来看,只有通过注释提供映射配置,它才能提取类型。如果您通过XML (或YAML,在较早版本的Doctrine中)配置ORM映射,那么我认为扩展将无法提取类型数据,而上述解决方案将是您唯一的方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71560316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档