Трансформирование
Трансформирование - это процесс преобразования свойства из одного типа в другое. На самом деле, вы можете преобразовывать данные так, как вам будет удобно - даже подменять значения. С технической точки зрения единственное, что имеет значение - это соблюдение типов.
Трансформеры в сериализации
class Album extends Data {
public function __construct(
public string $name,
#[SerializeBy(StudioSerializer::class)]
public Studio $studio
) {}
}
use Looqey\Speca\Contracts\Transformer;
use Looqey\Speca\Core\Property;
class StudioSerializer implements Transformer {
public function transform(mixed $value, Property $property): mixed {
assert($value instanceof Studio);
return $value->id;
}
}
$album = new Album("Dopethrone", new Studio(id: "f7246ef2-448f-4280-9b29-0a21a3306db1", name: "Some studio"));
$result = $album->toArray();
/* $result: [
* "name" => "Dopethrone",
* "studio" => "f7246ef2-448f-4280-9b29-0a21a3306db1"
] */
Этот пример показывает, как через атрибут SerializeBy
использовать сериализатор для преобразования объекта Studio
в его ID при сериализации.
Трансформеры в парсинге
class Studio extends Data {
public function __construct(
public string $id,
public string $name,
public string $city
) {}
}
class IdToStudioParser implements Transformer {
public function transform(mixed $value, Property $property): mixed {
$model = StudioModel::find($value); // находим студию по ID
return new Studio(
$model->id,
$model->name,
$model->city
);
}
}
class Album extends Data {
public function __construct(
public string $name,
public int $tracksCount,
public AlbumType $type,
#[ParseBy(IdToStudioParser::class)]
#[ParseFrom('studio_id')]
public Studio $studio
) {}
}
$album = Album::from(['name' => 'Dopethrone', 'tracksCount' => '8', 'type' => 'lp', 'studio_id' => 'f7246ef2-448f-4280-9b29-0a21a3306db1']);
В этом примере парсер IdToStudioParser
используется для парсинга поля studio_id
и преобразования его
в объект Studio
. Атрибут ParseBy
позволяет указать парсер, а ParseFrom
указывает на возможный источник данных.