<?php
declare(strict_types=1);
namespace Denios\Data\Shared\DataTransferObject;
use Denios\Data\Shared\ValueObject\ValueObject;
use Spatie\DataTransferObject\FieldValidator;
use Spatie\DataTransferObject\ValueCaster;
/**
* Class DataTransferObject (value object support)
*
* @author Sebastian Gieselmann <seg@denios.de>
* @package Denios\Data\Shared
*/
abstract class DataTransferObject extends \Spatie\DataTransferObject\DataTransferObject implements \JsonSerializable
{
/**
* Casts value
*
* @param \Spatie\DataTransferObject\ValueCaster $valueCaster
* @param \Spatie\DataTransferObject\FieldValidator $fieldValidator
* @param mixed $value
*
* @return mixed
*/
#[\Override]
protected function castValue(ValueCaster $valueCaster, FieldValidator $fieldValidator, $value)
{
return $valueCaster->cast($value, $fieldValidator);
}
/**
* Gets ValueCaster
*
* @return ValueCaster
*/
#[\Override]
protected function getValueCaster(): ValueCaster
{
return new \Denios\Data\Shared\DataTransferObject\ValueCaster();
}
/**
* Json serialization
*
* @return array
*/
#[\Override]
public function jsonSerialize() {
return $this->toArray();
}
/**
* Parses Array
*
* @param array $array
*
* @return array
*/
#[\Override]
protected function parseArray(array $array): array
{
foreach ($array as $key => $value) {
if ($value instanceof DataTransferObject || $value instanceof DataTransferObjectCollection) {
$array[$key] = $value->toArray();
continue;
}
// make ValueObject instances exportable
if ($value instanceof ValueObject) {
$array[$key] = $value->value();
continue;
}
if (!is_array($value)) {
continue;
}
$array[$key] = $this->parseArray($value);
}
return $array;
}
}