27 lines
785 B
PHP
27 lines
785 B
PHP
<?php
|
|
namespace sammo\DTO\Caster;
|
|
use Spatie\DataTransferObject\Caster;
|
|
|
|
class BackedEnumCaster implements Caster
|
|
{
|
|
private \ReflectionMethod $backedEnumFrom;
|
|
public function __construct(
|
|
array $type,
|
|
) {
|
|
$enumType = $type[0] ?? null;
|
|
if(!is_subclass_of($enumType, \BackedEnum::class)){
|
|
throw new \Exception('Not BackedEnum: '.$enumType);
|
|
}
|
|
$reflector = new \ReflectionEnum($enumType);
|
|
$this->backedEnumFrom = $reflector->getMethod('from');
|
|
}
|
|
|
|
public function cast(mixed $value): \BackedEnum
|
|
{
|
|
if(!is_string($value) && !is_int($value)){
|
|
throw new \Exception('BackedEnumCaster only accepts string|int');
|
|
}
|
|
|
|
return $this->backedEnumFrom->invoke(null, $value);
|
|
}
|
|
} |