diff --git a/src/ServiceContainer.php b/src/ServiceContainer.php index 22a8141..06aecd2 100644 --- a/src/ServiceContainer.php +++ b/src/ServiceContainer.php @@ -4,8 +4,10 @@ namespace IW; +use IW\ServiceContainer\AliasFactory; +use IW\ServiceContainer\CallableFactory; +use IW\ServiceContainer\ClassnameFactory; use IW\ServiceContainer\EmptyResultFromFactory; -use IW\ServiceContainer\FactoryContainer; use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; @@ -13,17 +15,12 @@ class ServiceContainer implements ContainerInterface { - /** @var FactoryContainer */ - private $factories; + /** @var callable[] */ + private $factories = []; /** @var mixed[] */ private $instances = []; - public function __construct() - { - $this->factories = new FactoryContainer(); - } - /** * Sets an alias for a dependency, it's useful for binding implementations * to a interface. Container will resolve alias as late as possible. @@ -43,7 +40,7 @@ public function __construct() */ public function alias(string $alias, string $id): void { - $this->factories->alias($alias, $id); + $this->factories[$alias] = new AliasFactory($id); } /** @@ -58,27 +55,32 @@ public function alias(string $alias, string $id): void */ public function bind(string $id, callable $factory): void { - $this->factories->bind($id, $factory); + $this->factories[$id] = new CallableFactory($factory); } public function factory(string $id): callable { - return $this->factories->get($id); + if (isset($this->factories[$id])) { + return $this->factories[$id]; + } + + return $this->factories[$id] = new ClassnameFactory($id); } /** * Finds an entry of the container by its identifier and returns it. * + * @template T * @param class-string $id Identifier of the entry to look for. * - * @return T + * @return mixed Entry. * * @throws NotFoundExceptionInterface No entry was found for **this** identifier. * @throws ContainerExceptionInterface Error while retrieving the entry. * - * @template T + * @return T */ - public function get($id) // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint,SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint,Generic.Files.LineLength.TooLong + public function get($id) // phpcs:ignore SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint { if (isset($this->instances[$id])) { return $this->instances[$id]; // try load a singleton if saved @@ -108,7 +110,7 @@ public function has($id) // phpcs:ignore SlevomatCodingStandard.TypeHints.Parame } // a factory exists - if ($this->factories->has($id)) { + if (isset($this->factories[$id])) { return true; } @@ -135,13 +137,12 @@ public function singleton(string $id) /** * Makes a new instance of a service. Dependencies are resolved from the container. * + * @template T * @param class-string $id ID of entry we want to create new instance of * * @return T - * - * @template T */ - public function make(string $id) // phpcs:ignore SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint,Generic.Files.LineLength.TooLong + public function make(string $id) { $instance = $this->factory($id)($this); diff --git a/src/ServiceContainer/FactoryContainer.php b/src/ServiceContainer/FactoryContainer.php deleted file mode 100644 index 00296f2..0000000 --- a/src/ServiceContainer/FactoryContainer.php +++ /dev/null @@ -1,35 +0,0 @@ -factories[$alias] = new AliasFactory($id); - } - - public function bind(string $id, callable $factory): void - { - $this->factories[$id] = new CallableFactory($factory); - } - - public function get(string $id): ServiceFactory - { - if (isset($this->factories[$id])) { - return $this->factories[$id]; - } - - return $this->factories[$id] = new ClassnameFactory($id); - } - - public function has(string $id): bool - { - return isset($this->factories[$id]); - } -} diff --git a/tests/ServiceContainerTest.php b/tests/ServiceContainerTest.php index e2817a1..d1e2393 100644 --- a/tests/ServiceContainerTest.php +++ b/tests/ServiceContainerTest.php @@ -109,7 +109,7 @@ public function testBindingCustomFactory(): void */ public function testHasMethod(string $id, bool $has): void { - $container = $this->createTestProxy(ServiceContainer::class, ['make']); + $container = $this->createPartialMock(ServiceContainer::class, ['make']); $container->expects($this->never())->method('make'); if ($has) { @@ -131,7 +131,7 @@ public function testHasASingleton(): void public function testHasAFactory(): void { - $container = $this->createTestProxy(ServiceContainer::class, ['make', 'factory']); + $container = $this->createPartialMock(ServiceContainer::class, ['make', 'factory']); $container->expects($this->never())->method('make'); $container->expects($this->never())->method('factory');