/** * XtrService constructor. * @param array $input * @param Application $app */ public function __construct(array $input, Application $app) { $this->app = $app; // default services: $services = ['i18n_switcher' => 'Webapper\\Xtr\\Services\\I18nSwitcher', 'fallbacks' => 'Webapper\\Xtr\\Services\\Fallbacks', 'distinct' => 'Webapper\\Xtr\\Services\\Distinct']; // adding required services if (isset($input['services'])) { foreach ($input['services'] as $name => $serviceClassName) { if (!in_array($serviceClassName, $services)) { if (!is_a($serviceClassName, 'Webapper\\Xtr\\Services\\XtrServiceInterface', true)) { throw new \RuntimeException('XTR service "' . $name . '" seems invalid (not implementing XtrServiceInterface). Remove or fix this service before of running!'); } $services[$name] = $serviceClassName; } } } // get settings: if (isset($input['settings']) and isset($input['settings']['ns_root'])) { $this->settings['ns_root'] = $input['settings']['ns_root']; } if (isset($input['settings']) and isset($input['settings']['disabled'])) { $this->settings['disabled'] = $input['settings']['disabled']; } // adding providers which not disabled: foreach ($services as $name => $serviceClassName) { if (in_array($name, $this->settings['disabled'])) { continue; } $config = isset($input[$name]) ? $input[$name] : []; $this->services[$name] = $serviceClassName; $input[$name] = Provider::Create(function (XtrService $c) use($name, $serviceClassName) { $service = new $serviceClassName($c['!' . $name], $c); return $service; })->mutate($config)->share(); } // creating request from globals $this->request = Request::createFromGlobals(); parent::__construct($input); }
public function testExtendedServiceExtension() { $d3i = new Container(); $d3i->extension = Provider::Create(function (Container $c, $s = null) { if ($s === null) { $service = new Service(); $service->settings = 'test'; return $service; } $s->settings = 'extended'; return $s; })->share(); $this->assertInstanceOf('Webapper\\D3I\\Provider', $d3i['extension']); $this->assertInstanceOf('Webapper\\D3I\\Tests\\Service', $d3i->extension); $service1 = $d3i->extension; $service2 = $d3i->extension; $this->assertSame($service1, $service2); $this->assertEquals('test', $service1->settings); $d3i->test = Provider::Create(function (Container $c) { $service = new Service(); $service->settings = 'test'; return $service; })->share(); $d3i->test = $d3i['test']->extend($d3i['extension']); $this->assertInstanceOf('Webapper\\D3I\\Provider', $d3i['test']); $this->assertInstanceOf('Webapper\\D3I\\Tests\\Service', $d3i->test); $service1 = $d3i->test; $service2 = $d3i->test; $this->assertSame($service1, $service2); $this->assertEquals('extended', $service1->settings); }