Skip to content

Commit

Permalink
Support parameters name binding
Browse files Browse the repository at this point in the history
  • Loading branch information
xepozz committed Feb 13, 2024
1 parent 9512d94 commit 7ea68b6
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
27 changes: 24 additions & 3 deletions src/DefinitionStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,33 @@ public function set(string $id, mixed $definition): void
*
* @throws CircularReferenceException
*/
private function isResolvable(string $id, array $building): bool
private function isResolvable(string $id, array $building, ?string $parameterName = null): bool
{
if (isset($this->definitions[$id])) {
return true;
}

if (
$parameterName !== null
&& isset($this->definitions[$id . '$'.$parameterName])
) {
$buildingClass = array_key_last($building);
$definition = $this->definitions[$buildingClass] ?? null;
$temporaryDefinition = ArrayDefinition::fromConfig([

Check failure on line 111 in src/DefinitionStorage.php

View workflow job for this annotation

GitHub Actions / psalm / PHP 8.0-ubuntu-latest

ArgumentTypeCoercion

src/DefinitionStorage.php:111:64: ArgumentTypeCoercion: Argument 1 of Yiisoft\Definitions\ArrayDefinition::fromConfig expects array{'__construct()'?: array<array-key, mixed>, class: class-string}<string, mixed>, but parent type array{'__construct()': non-empty-array<string, Yiisoft\Definitions\Reference>, class: null|string} provided (see https://psalm.dev/193)

Check failure on line 111 in src/DefinitionStorage.php

View workflow job for this annotation

GitHub Actions / psalm / PHP 8.1-ubuntu-latest

ArgumentTypeCoercion

src/DefinitionStorage.php:111:64: ArgumentTypeCoercion: Argument 1 of Yiisoft\Definitions\ArrayDefinition::fromConfig expects array{'__construct()'?: array<array-key, mixed>, class: class-string, ...<string, mixed>}, but parent type array{'__construct()': non-empty-array<string, Yiisoft\Definitions\Reference>, class: null|string} provided (see https://psalm.dev/193)
\Yiisoft\Definitions\ArrayDefinition::CLASS_NAME => $buildingClass,
\Yiisoft\Definitions\ArrayDefinition::CONSTRUCTOR => [
$parameterName => Reference::to($this->definitions[$id . '$' . $parameterName])
]
]);
if ($definition instanceof ArrayDefinition) {
$this->definitions[$buildingClass] = $definition->merge($temporaryDefinition);

Check failure on line 118 in src/DefinitionStorage.php

View workflow job for this annotation

GitHub Actions / psalm / PHP 8.0-ubuntu-latest

PossiblyNullArrayOffset

src/DefinitionStorage.php:118:17: PossiblyNullArrayOffset: Cannot access value on variable $this->definitions[$buildingClass] using possibly null offset null|string (see https://psalm.dev/125)

Check failure on line 118 in src/DefinitionStorage.php

View workflow job for this annotation

GitHub Actions / psalm / PHP 8.1-ubuntu-latest

PossiblyNullArrayOffset

src/DefinitionStorage.php:118:17: PossiblyNullArrayOffset: Cannot access value on variable $this->definitions[$buildingClass] using possibly null offset null|string (see https://psalm.dev/125)
} else {
$this->definitions[$buildingClass] = $temporaryDefinition;

Check failure on line 120 in src/DefinitionStorage.php

View workflow job for this annotation

GitHub Actions / psalm / PHP 8.0-ubuntu-latest

PossiblyNullArrayOffset

src/DefinitionStorage.php:120:17: PossiblyNullArrayOffset: Cannot access value on variable $this->definitions[$buildingClass] using possibly null offset null|string (see https://psalm.dev/125)

Check failure on line 120 in src/DefinitionStorage.php

View workflow job for this annotation

GitHub Actions / psalm / PHP 8.1-ubuntu-latest

PossiblyNullArrayOffset

src/DefinitionStorage.php:120:17: PossiblyNullArrayOffset: Cannot access value on variable $this->definitions[$buildingClass] using possibly null offset null|string (see https://psalm.dev/125)
}

return true;
}

if ($this->useStrictMode || !class_exists($id)) {
$this->buildStack += $building + [$id => 1];
return false;
Expand Down Expand Up @@ -210,7 +231,7 @@ private function isResolvable(string $id, array $building): bool
}

if (
!$this->isResolvable($typeName, $building)
!$this->isResolvable($typeName, $building, $parameter->getName())
&& ($this->delegateContainer === null || !$this->delegateContainer->has($typeName))
) {
$isResolvable = false;
Expand All @@ -222,7 +243,7 @@ private function isResolvable(string $id, array $building): bool
$this->buildStack += $building;
}

if ($isResolvable) {
if ($isResolvable && !isset($this->definitions[$id])) {
$this->definitions[$id] = $id;
}

Expand Down
4 changes: 4 additions & 0 deletions src/Helpers/Normalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ public static function normalize(mixed $definition, ?string $class = null): Defi
return $definition;
}

if ($definition instanceof DefinitionInterface) {
return $definition;
}

if (is_string($definition)) {
// Current class
if (
Expand Down

0 comments on commit 7ea68b6

Please sign in to comment.