Transformers take complex values and transform them into simple types. For example, a Carbon
object could be transformed to 16-05-1994T00:00:00+00
.
A transformer implements the following interface:
interface Transformer
{
public function transform(DataProperty $property, mixed $value, TransformationContext $context): mixed;
}
The following parameters are provided:
-
property: a
DataProperty
object which represents the property for which the value is transformed. You can read more about the internal structures of the package here
-
value: the value that should be transformed, this will never be
null
-
context: a
TransformationContext
object which contains the current transformation context with the following properties:
-
transformValues indicates if values should be transformed or not
-
mapPropertyNames indicates if property names should be mapped or not
-
wrapExecutionType the execution type that should be used for wrapping values
-
transformers a collection of transformers that can be used to transform values
In the end, the transformer should return a transformed value.
##Combining transformers and casts
You can transformers and casts in one class:
class ToUpperCastAndTransformer implements Cast, Transformer
{
public function cast(DataProperty $property, mixed $value, array $properties, CreationContext $context): string
{
return strtoupper($value);
}
public function transform(DataProperty $property, mixed $value, TransformationContext $context): string
{
return strtoupper($value);
}
}
Within your data object, you can use the WithCastAndTransform
attribute to use the cast and transformer:
class SongData extends Data
{
public function __construct(
public string $title,
#[WithCastAndTransform(SomeCastAndTransformer::class)]
public string $artist,
) {
}
}