/**
  * @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);
 }