addGlobal( SomeInterface::class, Binding::createFromImplementationClassName( SomeImplementation::class ) ); return $data; } }; $container = (new ContainerBuilder()) ->withBindingLoader($bindingLoader) ->build(); $injectableFactory = $container->get('injectableFactory'); $obj = $injectableFactory->create(SomeClass::class); $this->assertNotNull($obj); $this->assertInstanceOf( SomeImplementation::class, $obj->get() ); } public function testFactory(): void { $bindingLoader = new class() implements BindingLoader { public function load(): BindingData { $data = new BindingData(); $data->addGlobal( SomeInterface::class, Binding::createFromFactoryClassName( SomeFactory::class ) ); return $data; } }; $container = (new ContainerBuilder()) ->withBindingLoader($bindingLoader) ->build(); $injectableFactory = $container->get('injectableFactory'); $obj = $injectableFactory->create(SomeClass::class); $this->assertNotNull($obj); $this->assertInstanceOf( SomeImplementation::class, $obj->get() ); } public function testCallback() { $bindingLoader = new class() implements BindingLoader { public function load() : BindingData { $data = new BindingData(); $data->addGlobal( SomeInterface::class, Binding::createFromCallback( function (SomeImplementation $some) { return $some; } ) ); return $data; } }; $container = (new ContainerBuilder()) ->withBindingLoader($bindingLoader) ->build(); $injectableFactory = $container->get('injectableFactory'); $obj = $injectableFactory->create(SomeClass::class); $this->assertNotNull($obj); $this->assertInstanceOf( SomeImplementation::class, $obj->get() ); } public function testService() { $bindingLoader = new class() implements BindingLoader { public function load() : BindingData { $data = new BindingData(); $data->addGlobal( SomeService::class, Binding::createFromServiceName('someService') ); return $data; } }; $someService = new SomeService(); $container = (new ContainerBuilder()) ->withServices([ 'someService' => $someService, ]) ->withBindingLoader($bindingLoader) ->build(); $injectableFactory = $container->get('injectableFactory'); $obj = $injectableFactory->create(SomeClassRequiringService::class); $this->assertNotNull($obj); $this->assertSame( $someService, $obj->getService() ); } public function testValue() { $bindingLoader = new class() implements BindingLoader { public function load() : BindingData { $data = new BindingData(); $data->addContext( SomeClassRequiringValue::class, '$value', Binding::createFromValue('TEST_VALUE') ); return $data; } }; $container = (new ContainerBuilder()) ->withBindingLoader($bindingLoader) ->build(); $injectableFactory = $container->get('injectableFactory'); $obj = $injectableFactory->create(SomeClassRequiringValue::class); $this->assertNotNull($obj); $this->assertSame( 'TEST_VALUE', $obj->getValue() ); } }