/** * @param ApplicationInterface $app */ public function registerServices(ApplicationInterface $app) { $servers = $app->getConfig()->subset(BeanstalkServer::class); foreach ($servers as $service => $data) { $serviceName = self::SERVICE_PREFIX . $service; $service = new ClassServiceSpecs($serviceName, Pheanstalk::class); $service->setParams([$data['host'], $data['port'], $data['timeout'], $data['persistent']]); $service->setSetters(['useTube' => [$data['tube']]]); $app->getServicesFactory()->registerService($service); } }
/** * This test is not quite unit, but helped a lot pinpointing a very * twisted issue with static service references * * @throws Exception */ public function testStaticServiceReferenceSubstitutedByNewInstance() { $dependencyDefinition = new ClassServiceSpecs('dependency.id', DependencyService::class); $dependencyDefinition->setStatic(false); $serviceDefinition = new ClassServiceSpecs('main.service', TestService::class); $serviceDefinition->setSetters(['setOptionalDependency' => [new ServiceReference('dependency.id')]])->setStatic(false); $servicesFactory = (new ServicesFactory())->registerService($serviceDefinition, $dependencyDefinition); $firstInstance = $servicesFactory->get('main.service'); $secondInstance = $servicesFactory->get('main.service'); $this->assertNotSame($firstInstance, $secondInstance); $this->assertNotSame($firstInstance->getOptionalDependency(), $secondInstance->getOptionalDependency()); }
/** * Service definition factory * * IT IS NOT RECOMMENDED TO CALL THIS METHOD EXPLICITLY * * Please call AbstractServiceSpecs::factory(), that will * forward to the appropriate factory after having performed * basic sanity checks ('id' presence) * * @param array|Collection $rawDefinition * @throws Exception */ public static function factory($rawDefinition) { $rawDefinition = Collection::cast($rawDefinition); // then check check a class has been provided if (!$rawDefinition->has('class')) { throw new Exception('Missing \'class\' parameter', Exception::INCOMPLETE_SERVICE_SPECS); } if (!is_string($class = $rawDefinition['class'])) { throw new Exception('\'class\' parameter has to be a string', Exception::INVALID_SERVICE_SPECS); } $serviceDefinition = new ClassServiceSpecs($rawDefinition['id'], $class); // constructor params if ($rawDefinition->has('params')) { $serviceDefinition->setParams($rawDefinition['params']); } // setters if ($rawDefinition->has('setters')) { $serviceDefinition->setSetters($rawDefinition['setters']); } return $serviceDefinition; }
public function testClassServiceSpecsFactorySanityChecks() { // class parameter is missing $rawSpecs = ['id' => 'service.id']; $this->expectsException(function () use($rawSpecs) { ClassServiceSpecs::factory($rawSpecs); }, Exception::class, '\'class\'', Exception::INCOMPLETE_SERVICE_SPECS); // class parameter is not a string $rawSpecs = ['id' => 'service.id', 'class' => ['I am not a string']]; $this->expectsException(function () use($rawSpecs) { ClassServiceSpecs::factory($rawSpecs); }, Exception::class, '\'class\'', Exception::INVALID_SERVICE_SPECS); }
public function testIsServiceRegistered() { $factory = new ServicesFactory(); $serviceSpecs = new ClassServiceSpecs('service.id', \Fancy\Service\TestService::class); $serviceSpecs->setParams(['param' => 'default']); $factory->registerService($serviceSpecs); $this->assertTrue($factory->isServiceRegistered('service.id')); $this->assertFalse($factory->isServiceRegistered(uniqid(uniqid()))); }
public function testSingleAliasSetting() { $this->instance->setAliases('service.alias'); $this->assertAttributeEquals(Collection::cast(['service.alias']), 'aliases', $this->instance); }