簡體   English   中英

讓PHPStan明白 Laravel Eloquent Builder query()

[英]Make PHPStan understand Laravel Eloquent Builder query()

我很難讓 larastan / phpstan 明白query()應該基於Company model 而不是 Eloquent Eloquent\Model 我錯過了什么?

<?php

namespace App\Repositories;

use App\Models\Company;

/**
 * @extends AbstractBaseRepository<Company>
 */
class CompanyRepository extends AbstractBaseRepository
{
    public function __construct()
    {
        parent::__construct(new Company());
    }

    public function firstByDomain(string $domain): ?Company
    {
        return $this->query()
            ->where('domain', $domain)
            ->first();
    }
}

<?php

namespace App\Repositories;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

/**
 * @template TModel of Model
 */
abstract class AbstractBaseRepository
{
    /** @var TModel */
    protected $model;

    /** @param TModel $model */
    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    public function query(): Builder
    {
        return $this->model->query();
    }
}

這導致了這個錯誤:

方法 App\Repositories\CompanyRepository::firstByDomain() 應該返回 App\Models\Company|null 但返回 Illuminate\Database\Eloquent\Model|null。

在我看來,這是由query()方法引起的,為Illuminate\Database\Eloquent\Model返回一個 Eloquent Builder,我認為它應該在這里為App\Models\Company返回一個 Eloquent Builder。

您需要將AbstractBaseRepository中的query方法更改為如下所示:

/** @return Builder<TModel> */
public function query(): Builder
{
    return $this->model->query();
}

因為Builder class 也是通用的。 PHPStan 也不檢查函數/方法體。 所以你的返回類型需要准確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM