Schema.php 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. namespace PhpDevCommunity\RequestKit\Schema;
  3. use PhpDevCommunity\RequestKit\Builder\SchemaObjectFactory;
  4. use PhpDevCommunity\RequestKit\Generator\DefinitionGenerator;
  5. use PhpDevCommunity\RequestKit\Type\AbstractType;
  6. use ReflectionException;
  7. final class Schema extends AbstractSchema
  8. {
  9. /**
  10. * @var null|string|object
  11. */
  12. private $object = null;
  13. /**
  14. * @var AbstractType[]
  15. */
  16. private array $definitions;
  17. public static function create(array $definitions): Schema
  18. {
  19. return (new self())->setDefinitions($definitions);
  20. }
  21. /**
  22. * @param string|object $object
  23. * @param SchemaObjectFactory $factory
  24. * @return Schema
  25. */
  26. public static function createFromObject($object, SchemaObjectFactory $factory): Schema
  27. {
  28. return (new self())->generateDefinitionFromObject($object,$factory);
  29. }
  30. final public function extend(array $definitions): Schema
  31. {
  32. $schema = clone $this;
  33. $schema->setDefinitions($definitions + $this->definitions());
  34. return $schema;
  35. }
  36. /**
  37. * @param string|object $object
  38. * @param SchemaObjectFactory $factory
  39. * @return self
  40. */
  41. private function generateDefinitionFromObject($object, SchemaObjectFactory $factory): self
  42. {
  43. $definitionGenerator = new DefinitionGenerator($factory);
  44. $this->setDefinitions($definitionGenerator->generateFromObject($object));
  45. $this->object = $object;
  46. return $this;
  47. }
  48. private function setDefinitions(array $definitions): self
  49. {
  50. $this->definitions = $definitions;
  51. return $this;
  52. }
  53. public function getObject()
  54. {
  55. return $this->object;
  56. }
  57. protected function definitions(): array
  58. {
  59. return $this->definitions;
  60. }
  61. }