Skip to content
Snippets Groups Projects
Commit 86d8fc2b authored by Daniel Kurowski's avatar Daniel Kurowski
Browse files

Merge branch 'allow-customizations-on-scaffolded-objects' into 'master'

Allow customizations on scaffolded objects

See merge request !11
parents 47a9b90a 5d1a22af
No related branches found
No related tags found
1 merge request!11Allow customizations on scaffolded objects
Pipeline #33962 passed
/vendor/
.idea/
vendor/
composer.lock
......@@ -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": {
......
<?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();
}
}
<?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);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment