背景
我正在为一个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中指定接口的类型
1条答案
按热度按时间vmpqdwk31#
这个错误已经在这个PR中修复了。TGet,TSet添加在这个pull request中。我想你的错误会在下一个版本中修复。