我使用的是PHPStan及其理论扩展。
我有一个名为App\Repository\Doctrine\UserRepository的定制实体存储库,它带有@extends文档块:
/**
* @extends \Doctrine\ORM\EntityRepository<\App\Entity\User>
*/
class UserRepository extends EntityRepository implements IUserRepository
{
public function customRepositoryMethod()
{
// ...
}
}在控制器中,此代码:
public function getUserMatches(EntityManager $em)
{
$userRepo = $em->getRepository(\App\Entity\User::class);
$userRepo->customRepositoryMethod();
}...results在此PHPStan错误中:
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,但没有结果:
/**
* @implements \Doctrine\ORM\EntityRepository<\App\Entity\User>
*/发布于 2022-03-21 15:56:55
PhpStan无法知道EntityManager::getRepository()将返回您的自定义方法。
要么在那里添加一个@var注释:
/** @var UserRepository $userRepo */
$userRepo = $em->getRepository(\App\Entity\User::class);或者更好的是,只需注入UserRepository,而不是整个EntityManager
public function getUserMatches(UserRepository $userRepository)
{
$userRepository->customRepositoryMethod();
}以上内容将适用于PhpStan或任何现成的静态分析工具。(和,注入特定的存储库,而不是实体管理器在任何情况下都是更好的做法)。
但如果不是,您可以尝试安装PHPStan的理论扩展,这可能有助于工具理解代码基与Doctrine的关系。
如果您已经在使用Doctrine扩展,请注意,从我在文档中收集的内容来看,只有通过注释提供映射配置,它才能提取类型。如果您通过XML (或YAML,在较早版本的Doctrine中)配置ORM映射,那么我认为扩展将无法提取类型数据,而上述解决方案将是您唯一的方法。
https://stackoverflow.com/questions/71560316
复制相似问题