diff --git a/.gitignore b/.gitignore index 3a9875b460f3bab5c185900528ba5efe1a18de33..072705cd41d0111abef574c33e1978883bfc7e75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -/vendor/ +.idea/ +vendor/ composer.lock diff --git a/composer.json b/composer.json index 1f7d5643b07eae844705c2188e4998e2b528e49c..d1aaf19e30c36dc3e964f1b35840eea9718c1618 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "require": { "php": "^8.0", "dibi/dibi": "^4.0.2", - "grifart/scaffolder": "^0.5.0", + "grifart/scaffolder": "^0.5.3", "nette/utils": "^3.0.1" }, "require-dev": { diff --git a/src/Scaffolding/Builders.php b/src/Scaffolding/Builders.php new file mode 100644 index 0000000000000000000000000000000000000000..439104dd77cd1623b452e38b20990689f316d9dd --- /dev/null +++ b/src/Scaffolding/Builders.php @@ -0,0 +1,56 @@ +<?php declare(strict_types = 1); + +namespace Grifart\Tables\Scaffolding; + +use Grifart\ClassScaffolder\Definition\ClassDefinition; +use Grifart\ClassScaffolder\Definition\ClassDefinitionBuilder; + + +/** + * @implements \IteratorAggregate<ClassDefinition> + */ +final class Builders implements \IteratorAggregate +{ + private function __construct( + private ClassDefinitionBuilder $rowClass, + private ClassDefinitionBuilder $modificationsClass, + private ClassDefinitionBuilder $tableClass, + ) {} + + public static function from( + ClassDefinitionBuilder $rowClass, + ClassDefinitionBuilder $modificationsClass, + ClassDefinitionBuilder $tableClass, + ): self + { + return new self( + $rowClass, + $modificationsClass, + $tableClass, + ); + } + + public function getRowClass(): ClassDefinitionBuilder + { + return $this->rowClass; + } + + public function getModificationsClass(): ClassDefinitionBuilder + { + return $this->modificationsClass; + } + + public function getTableClass(): ClassDefinitionBuilder + { + return $this->tableClass; + } + + + public function getIterator(): \Traversable + { + yield $this->rowClass->build(); + yield $this->modificationsClass->build(); + yield $this->tableClass->build(); + } + +} diff --git a/src/Scaffolding/Scaffolding.php b/src/Scaffolding/Scaffolding.php index d83bd9673324b8c73dbd385af1bd1c0a569758d2..b6a83674df17b75ecd47791ce71bfa89988719f4 100644 --- a/src/Scaffolding/Scaffolding.php +++ b/src/Scaffolding/Scaffolding.php @@ -1,10 +1,7 @@ <?php declare(strict_types=1); - namespace Grifart\Tables\Scaffolding; -/** @var \Nette\DI\Container $container */ - use Grifart\ClassScaffolder\Decorators\GettersDecorator; use Grifart\ClassScaffolder\Decorators\InitializingConstructorDecorator; use Grifart\ClassScaffolder\Decorators\PropertiesDecorator; @@ -19,31 +16,68 @@ use function Grifart\ClassScaffolder\Definition\Types\resolve; final class Scaffolding { - private static function location(string $schema, string $table, string $column): string { + private static function location(string $schema, string $table, string $column): string + { return "$schema.$table.$column"; } + /** - * @return ClassDefinition[] + * Usage: + * ```php + * return Scaffolding::definitionsForPgTable(...); + * ``` */ public static function definitionsForPgTable( PostgresReflector $pgReflector, TypeMapper $mapper, string $schema, string $table, - string $rowClass, - string $modificationClass, - string $tableClass, + string $rowClassName, + string $modificationsClassName, + string $tableClassName, string $primaryKeyClass - ): array { + ): Builders + { + return self::buildersForPgTable( + $pgReflector, + $mapper, + $schema, + $table, + $rowClassName, + $modificationsClassName, + $tableClassName, + $primaryKeyClass, + ); + } + - $columnsNativeTypes = $pgReflector->retrieveColumnInfo($schema, $table); + /** + * Usage: + * ```php + * $builders = Scaffolding::buildersForPgTable(...); + * $builders->getRowClass()->decorate(...); + * return $builders; + * ``` + */ + public static function buildersForPgTable( + PostgresReflector $pgReflector, + TypeMapper $mapper, + string $schema, + string $tableClass, + string $rowClassName, + string $modificationsClassName, + string $tableClassName, + string $primaryKeyClass + ): Builders + { + $columnsNativeTypes = $pgReflector->retrieveColumnInfo($schema, $tableClass); if (\count($columnsNativeTypes) === 0) { throw new \LogicException('No columns found for given configuration. Does referenced table exist?'); } - $location = function(string $column) use ($schema, $table): string { - return self::location($schema, $table, $column); + $location = function(string $column) use ($schema, $tableClass): string { + return self::location($schema, $tableClass, $column); }; $columnsPhpTypes = []; @@ -59,36 +93,33 @@ final class Scaffolding return $builder; }; - return [ - // row class - $addTableFields(new ClassDefinitionBuilder($rowClass)) - ->implement(Row::class) - ->decorate(new PropertiesDecorator()) - ->decorate(new InitializingConstructorDecorator()) - ->decorate(new GettersDecorator()) - ->decorate(new PrivateConstructorDecorator()) - ->decorate(new ReconstituteConstructorDecorator()) - ->build(), - - // row modification class - $addTableFields(new ClassDefinitionBuilder($modificationClass)) - ->decorate(new ModificationsDecorator($tableClass, $primaryKeyClass)) - ->build(), - - // table class - (new ClassDefinitionBuilder($tableClass)) - ->decorate(new TableDecorator( - $schema, - $table, - $primaryKeyClass, - $rowClass, - $modificationClass, - $columnsNativeTypes, - $columnsPhpTypes, - )) - ->build(), - - ]; + + // row class + $rowClass = $addTableFields(new ClassDefinitionBuilder($rowClassName)) + ->implement(Row::class) + ->decorate(new PropertiesDecorator()) + ->decorate(new InitializingConstructorDecorator()) + ->decorate(new GettersDecorator()) + ->decorate(new PrivateConstructorDecorator()) + ->decorate(new ReconstituteConstructorDecorator()); + + // row modification class + $modificationsClass = $addTableFields(new ClassDefinitionBuilder($modificationsClassName)) + ->decorate(new ModificationsDecorator($tableClassName, $primaryKeyClass)); + + // table class + $tableClass = (new ClassDefinitionBuilder($tableClassName)) + ->decorate(new TableDecorator( + $schema, + $tableClass, + $primaryKeyClass, + $rowClassName, + $modificationsClassName, + $columnsNativeTypes, + $columnsPhpTypes, + )); + + return Builders::from($rowClass, $modificationsClass, $tableClass); } }