namespace App\Casters;
use dhy\LaravelMapWithCastMacro\Contract\Caster;
use Spatie\LaravelData\Data;
class SpatieLaravelDataCaster implements Caster
{
public function qualifies(mixed $type): bool
{
if (! is_string($type)) {
return false;
}
return is_subclass_of(object_or_class: $type, class: Data::class, allow_string: true);
}
/** @param Data $type */
public function cast(mixed $value, mixed $type): Data
{
return $type::from($value);
}
}
use Spatie\LaravelData\Data;
class CustomerData extends Data {
public function __construct(
public string $prename,
public string $surname,
public string $city,
) {}
}
collect([['prename' => 'Jane', 'surname' => 'Doe', 'city' => 'New York']])
->mapWithCast(fn (CustomerData $customer) => $customer->prename.' '.$customer->surname)
// Returns: ['Jane Doe']