-
-
Notifications
You must be signed in to change notification settings - Fork 312
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
82 changed files
with
2,925 additions
and
1,921 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
<?php | ||
|
||
namespace DI; | ||
|
||
/** | ||
* Compiled version of the dependency injection container. | ||
* | ||
* @author Matthieu Napoli <matthieu@mnapoli.fr> | ||
*/ | ||
abstract class CompiledContainer extends Container | ||
{ | ||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function get($name) | ||
{ | ||
// Try to find the entry in the singleton map | ||
if (isset($this->resolvedEntries[$name]) || array_key_exists($name, $this->resolvedEntries)) { | ||
return $this->resolvedEntries[$name]; | ||
} | ||
|
||
$method = static::METHOD_MAPPING[$name] ?? null; | ||
|
||
// If it's a compiled entry, then there is a method in this class | ||
if ($method !== null) { | ||
// Check if we are already getting this entry -> circular dependency | ||
if (isset($this->entriesBeingResolved[$name])) { | ||
throw new DependencyException("Circular dependency detected while trying to resolve entry '$name'"); | ||
} | ||
$this->entriesBeingResolved[$name] = true; | ||
|
||
try { | ||
$value = $this->$method(); | ||
} finally { | ||
unset($this->entriesBeingResolved[$name]); | ||
} | ||
|
||
// Store the entry to always return it without recomputing it | ||
$this->resolvedEntries[$name] = $value; | ||
|
||
return $value; | ||
} | ||
|
||
return parent::get($name); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function has($name) | ||
{ | ||
if (! is_string($name)) { | ||
throw new \InvalidArgumentException(sprintf( | ||
'The name parameter must be of type string, %s given', | ||
is_object($name) ? get_class($name) : gettype($name) | ||
)); | ||
} | ||
|
||
// The parent method is overridden to check in our array, it avoids resolving definitions | ||
if (isset(static::METHOD_MAPPING[$name])) { | ||
return true; | ||
} | ||
|
||
return parent::has($name); | ||
} | ||
} |
Oops, something went wrong.