vendor/spatie/data-transfer-object/src/ValueCaster.php line 40

Open in your IDE?
  1. <?php
  2. namespace Spatie\DataTransferObject;
  3. class ValueCaster
  4. {
  5. public function cast($value, FieldValidator $validator)
  6. {
  7. if (! $this->shouldBeCastToCollection($value)) {
  8. return $this->castValue($value, $validator->allowedTypes);
  9. }
  10. $values = $this->castCollection($value, $validator->allowedArrayTypes);
  11. $collectionType = $this->collectionType($validator->allowedTypes);
  12. return $collectionType ? new $collectionType($values) : $values;
  13. }
  14. public function castValue($value, array $allowedTypes)
  15. {
  16. $castTo = null;
  17. foreach ($allowedTypes as $type) {
  18. if (! is_subclass_of($type, DataTransferObject::class)) {
  19. continue;
  20. }
  21. $castTo = $type;
  22. break;
  23. }
  24. if (! $castTo) {
  25. return $value;
  26. }
  27. return new $castTo($value);
  28. }
  29. public function castCollection($values, array $allowedArrayTypes)
  30. {
  31. $castTo = null;
  32. foreach ($allowedArrayTypes as $type) {
  33. if (! is_subclass_of($type, DataTransferObject::class)) {
  34. continue;
  35. }
  36. $castTo = $type;
  37. break;
  38. }
  39. if (! $castTo) {
  40. return $values;
  41. }
  42. $casts = [];
  43. foreach ($values as $value) {
  44. $casts[] = new $castTo($value);
  45. }
  46. return $casts;
  47. }
  48. public function collectionType(array $types): string
  49. {
  50. foreach ($types as $type) {
  51. if (is_subclass_of($type, DataTransferObjectCollection::class)) {
  52. return $type;
  53. }
  54. }
  55. return false;
  56. }
  57. public function shouldBeCastToCollection(array $values): bool
  58. {
  59. if (empty($values)) {
  60. return false;
  61. }
  62. foreach ($values as $key => $value) {
  63. if (is_string($key)) {
  64. return false;
  65. }
  66. if (! is_array($value)) {
  67. return false;
  68. }
  69. }
  70. return true;
  71. }
  72. }