From 9e9626cf6c16f3af4a089acfd68e780f8dd04873 Mon Sep 17 00:00:00 2001 From: Charles Sprayberry Date: Fri, 14 Mar 2025 19:34:33 -0400 Subject: [PATCH 1/6] Use development ini when testing in CI --- .github/workflows/php.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 1611b8b..089364a 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -18,6 +18,7 @@ jobs: php-version: 8.2 extensions: xdebug tools: composer:2 + ini-file: development - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - name: Setup problem matchers for PHPUnit From 541e30f863d48d47af5ae304bc3e6161925f09ee Mon Sep 17 00:00:00 2001 From: Charles Sprayberry Date: Fri, 14 Mar 2025 19:36:07 -0400 Subject: [PATCH 2/6] Update assertion to properly check for interface --- .../AnnotatedTargetContainerDefinitionAnalyzer.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php b/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php index 5b8ed93..7cb47b1 100644 --- a/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php +++ b/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php @@ -279,7 +279,10 @@ private function addAliasDefinitions(ContainerDefinitionBuilder $containerDefini foreach ($abstractTypes as $abstractType) { foreach ($concreteTypes as $concreteType) { $abstractTypeString = $abstractType->name(); - assert(class_exists($abstractTypeString), "The type $abstractTypeString does not exist"); + assert( + class_exists($abstractTypeString) || interface_exists($abstractTypeString), + "The type $abstractTypeString does not exist" + ); if (is_subclass_of($concreteType->name(), $abstractTypeString)) { $aliasDefinition = definitionFactory()->aliasDefinition($abstractType, $concreteType); $containerDefinitionBuilder = $containerDefinitionBuilder->withAliasDefinition($aliasDefinition); From f9301a7584468802760b6938173d80888de9f9b8 Mon Sep 17 00:00:00 2001 From: Charles Sprayberry Date: Fri, 14 Mar 2025 19:38:02 -0400 Subject: [PATCH 3/6] Check for interface in TypeFactory assertion --- src/Reflection/TypeFactory.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Reflection/TypeFactory.php b/src/Reflection/TypeFactory.php index 13510b7..a43a443 100644 --- a/src/Reflection/TypeFactory.php +++ b/src/Reflection/TypeFactory.php @@ -57,7 +57,10 @@ public function fromName(string $name) : Type { default => null, }; if ($type === null) { - assert(class_exists($name)); + assert( + class_exists($name) || interface_exists($name), + "The type $name does not exist" + ); $type = $this->class($name); } From 8ce8f92f182ebe5d063efe03d70f04eaed3f9147 Mon Sep 17 00:00:00 2001 From: Charles Sprayberry Date: Fri, 14 Mar 2025 19:41:22 -0400 Subject: [PATCH 4/6] Fix more class check asserts --- .../XmlContainerDefinitionSerializer.php | 5 ++++- .../Check/MultiplePrimaryForAbstractService.php | 5 ++++- ...AnnotatedTargetContainerDefinitionAnalyzer.php | 15 +++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Definition/Serializer/XmlContainerDefinitionSerializer.php b/src/Definition/Serializer/XmlContainerDefinitionSerializer.php index 0d261b0..5615855 100644 --- a/src/Definition/Serializer/XmlContainerDefinitionSerializer.php +++ b/src/Definition/Serializer/XmlContainerDefinitionSerializer.php @@ -305,7 +305,10 @@ private function addServiceDefinitionsToBuilder(ContainerDefinitionBuilder $buil foreach ($serviceDefinitions as $serviceDefinition) { $serviceType = $xpath->query('cd:type/text()', $serviceDefinition)[0]->nodeValue; - assert(class_exists($serviceType)); + assert( + class_exists($serviceType) || interface_exists($serviceType), + "The type $serviceType does not exist" + ); $isConcrete = $xpath->query('@isConcrete', $serviceDefinition)[0]->nodeValue === 'true'; $attr = unserialize(base64_decode( $xpath->query('cd:attribute/text()', $serviceDefinition)[0]?->nodeValue diff --git a/src/LogicalConstraint/Check/MultiplePrimaryForAbstractService.php b/src/LogicalConstraint/Check/MultiplePrimaryForAbstractService.php index 76c1cb9..32cef28 100644 --- a/src/LogicalConstraint/Check/MultiplePrimaryForAbstractService.php +++ b/src/LogicalConstraint/Check/MultiplePrimaryForAbstractService.php @@ -68,7 +68,10 @@ private function getConcreteServicesInstanceOf(ContainerDefinition $containerDef foreach ($containerDefinition->serviceDefinitions() as $service) { if ($service->isConcrete()) { $serviceDefinitionType = $serviceDefinition->type()->name(); - assert(class_exists($serviceDefinitionType)); + assert( + class_exists($serviceDefinitionType) || interface_exists($serviceDefinitionType), + "The type $serviceDefinitionType does not exist" + ); if (is_subclass_of($service->type()->name(), $serviceDefinitionType)) { yield $service; } diff --git a/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php b/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php index 7cb47b1..cf5cfb0 100644 --- a/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php +++ b/src/StaticAnalysis/AnnotatedTargetContainerDefinitionAnalyzer.php @@ -189,7 +189,10 @@ private function addAnnotatedDefinitions( foreach ($abstractPrepareDefinitions as $abstractPrepareDefinition) { $concreteServiceName = $concretePrepareDefinition->service()->name(); $abstractServiceName = $abstractPrepareDefinition->service()->name(); - assert(class_exists($abstractServiceName)); + assert( + class_exists($abstractServiceName) || interface_exists($abstractServiceName), + "The type $abstractServiceName does not exist" + ); if (is_subclass_of($concreteServiceName, $abstractServiceName)) { $hasAbstractPrepare = true; break; @@ -277,12 +280,12 @@ private function addAliasDefinitions(ContainerDefinitionBuilder $containerDefini } foreach ($abstractTypes as $abstractType) { + $abstractTypeString = $abstractType->name(); + assert( + class_exists($abstractTypeString) || interface_exists($abstractTypeString), + "The type $abstractTypeString does not exist" + ); foreach ($concreteTypes as $concreteType) { - $abstractTypeString = $abstractType->name(); - assert( - class_exists($abstractTypeString) || interface_exists($abstractTypeString), - "The type $abstractTypeString does not exist" - ); if (is_subclass_of($concreteType->name(), $abstractTypeString)) { $aliasDefinition = definitionFactory()->aliasDefinition($abstractType, $concreteType); $containerDefinitionBuilder = $containerDefinitionBuilder->withAliasDefinition($aliasDefinition); From d7fbea66bc0a53b29cf0bd714a26facdc178b41d Mon Sep 17 00:00:00 2001 From: Charles Sprayberry Date: Fri, 14 Mar 2025 19:43:01 -0400 Subject: [PATCH 5/6] Fix serializer alias assert --- .../Serializer/XmlContainerDefinitionSerializer.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Definition/Serializer/XmlContainerDefinitionSerializer.php b/src/Definition/Serializer/XmlContainerDefinitionSerializer.php index 5615855..e4dd6ff 100644 --- a/src/Definition/Serializer/XmlContainerDefinitionSerializer.php +++ b/src/Definition/Serializer/XmlContainerDefinitionSerializer.php @@ -334,7 +334,11 @@ private function addAliasDefinitionsToBuilder(ContainerDefinitionBuilder $builde $abstract = $xpath->query('cd:abstractService/text()', $aliasDefinition)[0]->nodeValue; $concrete = $xpath->query('cd:concreteService/text()', $aliasDefinition)[0]->nodeValue; - assert(class_exists($abstract)); + assert( + class_exists($abstract) || interface_exists($abstract), + "The type $abstract does not exist" + ); + // we are not checking for interface_exists() here because an interface cannot be a concrete service assert(class_exists($concrete)); $builder = $builder->withAliasDefinition( From 7acd5c1a36a72e62b3405851cf0eabf70327dd60 Mon Sep 17 00:00:00 2001 From: Charles Sprayberry Date: Fri, 14 Mar 2025 19:44:44 -0400 Subject: [PATCH 6/6] FIx more serializer class asserts --- .../Serializer/XmlContainerDefinitionSerializer.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Definition/Serializer/XmlContainerDefinitionSerializer.php b/src/Definition/Serializer/XmlContainerDefinitionSerializer.php index e4dd6ff..bffee78 100644 --- a/src/Definition/Serializer/XmlContainerDefinitionSerializer.php +++ b/src/Definition/Serializer/XmlContainerDefinitionSerializer.php @@ -358,7 +358,10 @@ private function addServicePrepareDefinitionsToBuilder(ContainerDefinitionBuilde $method = $xpath->query('cd:method/text()', $prepareDefinition)[0]->nodeValue; $attr = unserialize(base64_decode($xpath->query('cd:attribute/text()', $prepareDefinition)[0]?->nodeValue)); - assert(class_exists($service)); + assert( + class_exists($service) || interface_exists($service), + "The type $service does not exist" + ); assert($method !== null && $method !== ''); $builder = $builder->withServicePrepareDefinition( @@ -379,7 +382,11 @@ private function addServiceDelegateDefinitionsToBuilder(ContainerDefinitionBuild $delegateMethod = $xpath->query('cd:delegateMethod/text()', $delegateDefinition)[0]->nodeValue; $attr = unserialize(base64_decode($xpath->query('cd:attribute/text()', $delegateDefinition)[0]?->nodeValue)); - assert(class_exists($service)); + assert( + class_exists($service) || interface_exists($service), + "The type $service does not exist" + ); + // we are not checking for interface_exists() because a delegate must be a concrete type assert(class_exists($delegateType)); assert($delegateMethod !== null && $delegateMethod !== '');