laravel phpstan:类实现泛型接口但未指定其类型错误

9jyewag0  于 2023-02-10  发布在  PHP
关注(0)|答案(1)|浏览(163)

背景

我正在为一个laravel系统构建一个类。它是为了在laravel模型中铸造Ramsey\Uuid\Uuid类型。我也使用phpstan,我似乎在泛型/模板方面遇到了问题。

  • 在数据库中,uuid存储为二进制
  • 加载或设置时,强制Ramsey\Uuid\UuidInterface

问题是

laravel供应商软件包具有以下接口:

/**
 * @template TGet
 * @template TSet
 */
interface CastsAttributes
{
    /**
     * Transform the attribute from the underlying model values.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  mixed  $value
     * @param  array  $attributes
     * @return TGet|null
     */
    public function get($model, string $key, $value, array $attributes);

    /**
     * Transform the attribute to its underlying model values.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  TSet|null  $value
     * @param  array  $attributes
     * @return mixed
     */
    public function set($model, string $key, $value, array $attributes);
}

我的类Uuid实现了这个

// ...
use Ramsey\Uuid\Uuid as RamseyUuid;
use Ramsey\Uuid\UuidInterface;
// ...

class Uuid implements CastsAttributes // ...
{
    /**
     * Cast the given value.
     *
     * @param Model $model
     * @param string $key
     * @param string $value
     * @param array<mixed> $attributes
     * @return UuidInterface
     */
    public function get($model, string $key, $value, array $attributes)
    {
        $uuid = RamseyUuid::fromBytes($value);
        return $uuid;
    }

    /**
     * Prepare the given value for storage.
     *
     * @param Model $model
     * @param string $key
     * @param UuidInterface $value
     * @param array<mixed> $attributes
     * @return string
     * @throws Exception
     */
    public function set($model, string $key, $value, array $attributes)
    {
        if (!$value instanceof (UuidInterface::class)) {
            throw new Exception('The uuid property is not an instance of Ramsey - UuidInterface');
        }

        return $value->getBytes();
    }

当我运行phpstan(6级以上)时,我得到以下错误:

  • Class Uuid implements generic interface Illuminate\Contracts\Database\Eloquent\CastsAttributes but does not specify its types: TGet, TSet

我已经读了很多遍phpstan的文档(泛型部分,泛型的例子),我只是不确定它与我所面临的问题有什么关系,我也使用了操场,它也没有帮助我理解这个问题。

问题

如何在phpstan中指定接口的类型

vmpqdwk3

vmpqdwk31#

这个错误已经在这个PR中修复了。TGet,TSet添加在这个pull request中。我想你的错误会在下一个版本中修复。

相关问题