2
0

SerializerToArray.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. namespace PhpDevCommunity\PaperORM\Serializer;
  3. use LogicException;
  4. use PhpDevCommunity\PaperORM\Mapper\ColumnMapper;
  5. use PhpDevCommunity\PaperORM\Mapping\Column\DateTimeColumn;
  6. use PhpDevCommunity\PaperORM\Mapping\Column\JoinColumn;
  7. use ReflectionClass;
  8. use ReflectionException;
  9. final class SerializerToArray
  10. {
  11. private object $entity;
  12. public function __construct(object $entity)
  13. {
  14. $this->entity = $entity;
  15. }
  16. public function serialize(): array
  17. {
  18. $entity = $this->entity;
  19. $columns = ColumnMapper::getColumns(get_class($entity));
  20. if (count($columns) === 0) {
  21. return [];
  22. }
  23. $reflection = new ReflectionClass($entity);
  24. $data = [];
  25. foreach ($columns as $column) {
  26. try {
  27. if (false !== ($reflectionParent = $reflection->getParentClass()) && $reflectionParent->hasProperty($column->getProperty())) {
  28. $property = $reflectionParent->getProperty($column->getProperty());
  29. }else {
  30. $property = $reflection->getProperty($column->getProperty());
  31. }
  32. } catch (ReflectionException $e) {
  33. throw new LogicException("Property {$column->getProperty()} not found in class " . get_class($entity));
  34. }
  35. $property->setAccessible(true);
  36. $value = $property->getValue($entity);
  37. $propertyName = $column->getProperty();
  38. if (is_iterable($value)) {
  39. $data[$propertyName] = iterator_to_array($value);
  40. continue;
  41. }
  42. if ($column instanceof DateTimeColumn) {
  43. $data[$propertyName] = $column->convertToDatabase($value);
  44. continue;
  45. }
  46. if ($column instanceof JoinColumn) {
  47. $data[$propertyName] = (new self($value))->serialize();
  48. continue;
  49. }
  50. $data[$propertyName] = $property->getValue($entity);
  51. }
  52. return $data;
  53. }
  54. }