Force Repository返回CustomClass类型而不是Object类型

时间:2018-02-20 17:45:23

标签: php symfony doctrine php-7 return-type

在我使用Symfony 4,Doctrine 2和PHP 7.2的项目中,我有一个名为 Location 的实体和一个 LocationRepository (从Doctrine的ServiceEntityRepository扩展而来)。

我正在实现一个 findLocationByUuid 方法,其中给定一个字符串,返回一个位置:

public function getLocationByUuid(string $uuid): Location
{
    $location = $this->findOneBy(['uuid' => $uuid]);

    if (null == $location) {
        throw new LocationNotFoundException();
    }

    return $location;
}

由于Doctrine的 findOneBy 方法返回 Object ,因此在方法中严格拟合我的返回类型声明并返回 Location 而不是 Object ?我是否应该假设此Object与我的Locations具有相同的行为并将Object声明为返回类型?

2 个答案:

答案 0 :(得分:1)

Symfony 4 ./ bin / console make:entity 命令创建实体&存储库类。如示例所示,存储库类具有注释方法,因此您的问题应该得到解决

/**
 * @method TinyPuppy|null find($id, $lockMode = null, $lockVersion = null)
 * @method TinyPuppy|null findOneBy(array $criteria, array $orderBy = null)
 * @method TinyPuppy[]    findAll()
 * @method TinyPuppy[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class TinyPuppyRepository extends ServiceEntityRepository

答案 1 :(得分:0)

Doctrine的findOneBy是通用的,因此它不能强制Location作为返回类型。在我的情况下,我要做的是,不是检查位置是否为空,而是检查它是否是Location的实例,所以:

if (!$location instanceof Location) {
    throw new LocationNotFoundException();
}

通过这种方式,您可以确定如果您的方法返回某些内容,则为Location