From 117647c35f02461bb804da515cc8c3a5e48e95ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pudil?= <me@jiripudil.cz> Date: Fri, 30 Oct 2020 13:18:50 +0100 Subject: [PATCH] Add Table::newEmpty() that preserves the original behaviour of new(). It can still be useful at times --- src/Scaffolding/ModificationsDecorator.php | 35 ++-------------------- src/Scaffolding/Scaffolding.php | 2 +- src/Scaffolding/TableDecorator.php | 27 ++++++++++------- 3 files changed, 21 insertions(+), 43 deletions(-) diff --git a/src/Scaffolding/ModificationsDecorator.php b/src/Scaffolding/ModificationsDecorator.php index dbdbc89..049fc6e 100644 --- a/src/Scaffolding/ModificationsDecorator.php +++ b/src/Scaffolding/ModificationsDecorator.php @@ -20,17 +20,11 @@ final class ModificationsDecorator implements ClassDecorator private string $primaryKeyClass; - private array $columnInfo; - - /** - * @param Column[] $columnInfo - */ - public function __construct(string $relatedTable, string $primaryKeyClass, array $columnInfo) + public function __construct(string $relatedTable, string $primaryKeyClass) { $this->modificationsStorage = '$this->modifications'; $this->relatedTableClass = $relatedTable; $this->primaryKeyClass = $primaryKeyClass; - $this->columnInfo = $columnInfo; } @@ -57,34 +51,11 @@ final class ModificationsDecorator implements ClassDecorator ]) ->setBody('return self::_update($primaryKey);'); - $newMethod = $classType->addMethod('new') + $classType->addMethod('new') ->setStatic() ->setVisibility('public') ->setReturnType('self') - ->addBody('$self = self::_new();'); - foreach ($definition->getFields() as $fieldName => $fieldType) { - $columnInfo = $this->columnInfo[$fieldName]; - if ( ! $columnInfo->hasDefaultValue()) { - $newMethod->addParameter($fieldName) - ->setTypeHint($fieldType->getTypeHint()) - ->setNullable($fieldType->isNullable()); - - if ($fieldType->requiresDocComment()) { - $newMethod->addComment(\sprintf( - '@param %s $%s%s', - $fieldType->getDocCommentType($namespace), - $fieldName, - $fieldType->hasComment() ? ' ' . $fieldType->getComment($namespace) : '', - )); - } - - $newMethod->addBody('$self->modifications[?] = ?;', [ - $fieldName, - new PhpLiteral('$' . $fieldName), - ]); - } - } - $newMethod->addBody('return $self;'); + ->setBody('return self::_new();'); // implement forTable method $namespace->addUse($this->relatedTableClass); diff --git a/src/Scaffolding/Scaffolding.php b/src/Scaffolding/Scaffolding.php index bbf469c..2edb17c 100644 --- a/src/Scaffolding/Scaffolding.php +++ b/src/Scaffolding/Scaffolding.php @@ -69,7 +69,7 @@ final class Scaffolding // row modification class $addTableFields(new ClassDefinitionBuilder($modificationClass)) - ->decorate(new ModificationsDecorator($tableClass, $primaryKeyClass, $columnsNativeTypes)) + ->decorate(new ModificationsDecorator($tableClass, $primaryKeyClass)) ->build(), // table class diff --git a/src/Scaffolding/TableDecorator.php b/src/Scaffolding/TableDecorator.php index 90313f4..526ec36 100644 --- a/src/Scaffolding/TableDecorator.php +++ b/src/Scaffolding/TableDecorator.php @@ -148,10 +148,20 @@ final class TableDecorator implements ClassDecorator ); foreach (['add', 'new'] as $methodName) { + $classType->addMethod("${methodName}Empty") + ->setReturnType($this->modificationClass) + ->setBody( + 'return ?::new();', + [new Code\PhpLiteral($namespace->unresolveName($this->modificationClass))], + ); + $addMethod = $classType->addMethod($methodName) - ->setReturnType($this->modificationClass); + ->setReturnType($this->modificationClass) + ->addBody( + '$modifications = ?::new();', + [new Code\PhpLiteral($namespace->unresolveName($this->modificationClass))], + ); - $fieldNames = []; foreach ($this->columnInfo as $columnInfo) { if ( ! $columnInfo->hasDefaultValue()) { $fieldName = $columnInfo->getName(); @@ -170,17 +180,14 @@ final class TableDecorator implements ClassDecorator )); } - $fieldNames[] = new Code\PhpLiteral('$' . $fieldName); + $addMethod->addBody( + '$modifications->modify' . \ucfirst($fieldName) . '(?);', + [new Code\PhpLiteral('$' . $fieldName)], + ); } } - $addMethod->setBody( - 'return ?::new(...?);', - [ - new Code\PhpLiteral($namespace->unresolveName($this->modificationClass)), - $fieldNames, - ] - ); + $addMethod->addBody('return $modifications;'); } -- GitLab