diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 1b281158..556706dc 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -284,7 +284,7 @@ parameters: path: test/Unit/EntityDefinitionTest.php - - message: "#^Parameter \\#2 \\$fieldDefinitions of class Ergebnis\\\\FactoryBot\\\\EntityDefinition constructor expects array\\, array\\ given\\.$#" + message: "#^Parameter \\#2 \\$fieldDefinitions of static method Ergebnis\\\\FactoryBot\\\\EntityDefinition\\:\\:create\\(\\) expects array\\, array\\ given\\.$#" count: 1 path: test/Unit/EntityDefinitionTest.php diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 33873355..228e75e9 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -80,6 +80,12 @@ + + + fieldDefinitions]]> + ]]> + + diff --git a/src/EntityDefinition.php b/src/EntityDefinition.php index aaf231d2..98147105 100644 --- a/src/EntityDefinition.php +++ b/src/EntityDefinition.php @@ -20,16 +20,23 @@ */ final class EntityDefinition { + private function __construct( + private ORM\Mapping\ClassMetadata $classMetadata, + private array $fieldDefinitions, + private \Closure $afterCreate, + ) { + } + /** * @param array $fieldDefinitions * * @throws Exception\InvalidFieldDefinitions */ - public function __construct( - private ORM\Mapping\ClassMetadata $classMetadata, - private array $fieldDefinitions, - private \Closure $afterCreate, - ) { + public static function create( + ORM\Mapping\ClassMetadata $classMetadata, + array $fieldDefinitions, + \Closure $afterCreate, + ): self { $invalidFieldDefinitions = \array_filter($fieldDefinitions, static function ($fieldDefinition): bool { return !$fieldDefinition instanceof FieldDefinition\Resolvable; }); @@ -37,6 +44,12 @@ public function __construct( if ([] !== $invalidFieldDefinitions) { throw Exception\InvalidFieldDefinitions::values(); } + + return new self( + $classMetadata, + $fieldDefinitions, + $afterCreate, + ); } /** diff --git a/src/FixtureFactory.php b/src/FixtureFactory.php index 2585ba11..cf341994 100644 --- a/src/FixtureFactory.php +++ b/src/FixtureFactory.php @@ -122,7 +122,7 @@ public function define( }; } - $this->entityDefinitions[$className] = new EntityDefinition( + $this->entityDefinitions[$className] = EntityDefinition::create( $classMetadata, $fieldDefinitions, $afterCreate, diff --git a/test/Unit/EntityDefinitionTest.php b/test/Unit/EntityDefinitionTest.php index 46792a77..9e060037 100644 --- a/test/Unit/EntityDefinitionTest.php +++ b/test/Unit/EntityDefinitionTest.php @@ -29,7 +29,7 @@ final class EntityDefinitionTest extends Framework\TestCase use Test\Util\Helper; #[Framework\Attributes\DataProviderExternal(Test\DataProvider\ValueProvider::class, 'arbitrary')] - public function testConstructorRejectsFieldDefinitionsWhenValuesAreNotFieldDefinitions(mixed $fieldDefinition): void + public function testCreateRejectsFieldDefinitionsWhenValuesAreNotFieldDefinitions(mixed $fieldDefinition): void { $fieldDefinitions = [ 'foo' => FieldDefinition::value('bar'), @@ -38,7 +38,7 @@ public function testConstructorRejectsFieldDefinitionsWhenValuesAreNotFieldDefin $this->expectException(Exception\InvalidFieldDefinitions::class); - new EntityDefinition( + EntityDefinition::create( $this->createMock(ORM\Mapping\ClassMetadata::class), $fieldDefinitions, static function ($entity, array $fieldValues): void { @@ -47,7 +47,7 @@ static function ($entity, array $fieldValues): void { ); } - public function testConstructorSetsValues(): void + public function testCreateReturnsEntityDefinition(): void { $classMetadata = $this->createMock(ORM\Mapping\ClassMetadata::class); @@ -60,7 +60,7 @@ public function testConstructorSetsValues(): void // intentionally left blank }; - $entityDefinition = new EntityDefinition( + $entityDefinition = EntityDefinition::create( $classMetadata, $fieldDefinitions, $afterCreate,