BaseDTO.php 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. namespace Knuckles\Camel;
  3. use Illuminate\Contracts\Support\Arrayable;
  4. use Spatie\DataTransferObject\DataTransferObject;
  5. class BaseDTO extends DataTransferObject implements Arrayable
  6. {
  7. /**
  8. * @var array $custom
  9. * Added so end-users can dynamically add additional properties for their own use.
  10. */
  11. public array $custom = [];
  12. public static function create(BaseDTO|array $data, BaseDTO|array $inheritFrom = []): static
  13. {
  14. if ($data instanceof static) {
  15. return $data;
  16. }
  17. $mergedData = $inheritFrom instanceof static ? $inheritFrom->toArray() : $inheritFrom;
  18. foreach ($data as $property => $value) {
  19. $mergedData[$property] = $value;
  20. }
  21. return new static($mergedData);
  22. }
  23. protected function parseArray(array $array): array
  24. {
  25. // Reimplementing here so our DTOCollection items can be recursively toArray'ed
  26. foreach ($array as $key => $value) {
  27. if ($value instanceof Arrayable) {
  28. $array[$key] = $value->toArray();
  29. continue;
  30. }
  31. if (! is_array($value)) {
  32. continue;
  33. }
  34. $array[$key] = $this->parseArray($value);
  35. }
  36. return $array;
  37. }
  38. }