/** * @param string $serviceName * @param string $cacheDirectory */ private function createEagerProxy($serviceName, $cacheDirectory) { $definition = $this->builder->getDefinition($serviceName); $this->builder->removeDefinition($serviceName); $hiddenServiceName = $this->prefix($serviceName); $proxyClassName = $definition->getClass() . md5(serialize($definition)); $this->builder->addDefinition($serviceName)->setClass($proxyClassName)->setFactory('@' . $this->prefix('eagerServiceFactory') . '::create', array($hiddenServiceName, $proxyClassName)); $this->builder->addDefinition($hiddenServiceName, $definition)->setAutowired(false); if (!class_exists($proxyClassName)) { $classGenerator = new ClassGenerator(); $this->proxyGenerator->generate(new \ReflectionClass($definition->getClass()), $classGenerator); $classGenerator->setName($proxyClassName); $code = '<?php' . ClassGenerator::LINE_FEED . $classGenerator->generate(); $tempPath = $cacheDirectory . uniqid() . ".php"; $backslashPos = strrpos($proxyClassName, '\\'); $newPath = $cacheDirectory . substr($proxyClassName, $backslashPos ? $backslashPos + 1 : 0) . ".php"; file_put_contents($tempPath, $code, LOCK_EX); rename($tempPath, $newPath); require_once $newPath; } }
/** * Parses section 'services' from configuration file. * @return void */ public static function parseServices(Nette\DI\ContainerBuilder $container, array $config, $namespace = NULL) { $services = isset($config['services']) ? $config['services'] : array(); $factories = isset($config['factories']) ? $config['factories'] : array(); $all = array_merge($services, $factories); uasort($all, function ($a, $b) { return strcmp(Helpers::isInheriting($a), Helpers::isInheriting($b)); }); foreach ($all as $origName => $def) { $shared = array_key_exists($origName, $services); if ((string) (int) $origName === (string) $origName) { $name = (string) (count($container->getDefinitions()) + 1); } elseif ($shared && array_key_exists($origName, $factories)) { throw new Nette\DI\ServiceCreationException("It is not allowed to use services and factories with the same name: '{$origName}'."); } else { $name = ($namespace ? $namespace . '.' : '') . strtr($origName, '\\', '_'); } if (($parent = Helpers::takeParent($def)) && $parent !== $name) { $container->removeDefinition($name); $definition = $container->addDefinition($name); if ($parent !== Helpers::OVERWRITE) { foreach ($container->getDefinition($parent) as $k => $v) { $definition->{$k} = unserialize(serialize($v)); // deep clone } } } elseif ($container->hasDefinition($name)) { $definition = $container->getDefinition($name); if ($definition->shared !== $shared) { throw new Nette\DI\ServiceCreationException("It is not allowed to use service and factory with the same name '{$name}'."); } } else { $definition = $container->addDefinition($name); } try { static::parseService($definition, $def, $shared); } catch (\Exception $e) { throw new Nette\DI\ServiceCreationException("Service '{$name}': " . $e->getMessage(), NULL, $e); } } }
/** * Parses section 'services' from (unexpanded) configuration file. * @return void */ public static function parseServices(ContainerBuilder $builder, array $config, string $namespace = NULL) { $services = isset($config['services']) ? $config['services'] : []; $depths = []; foreach ($services as $name => $def) { $path = []; while (Config\Helpers::isInheriting($def)) { $path[] = $def; $def = isset($services[$def[Config\Helpers::EXTENDS_KEY]]) ? $services[$def[Config\Helpers::EXTENDS_KEY]] : []; if (in_array($def, $path, TRUE)) { throw new ServiceCreationException("Circular reference detected for service '{$name}'."); } } $depths[$name] = count($path); } array_multisort($depths, $services); foreach ($services as $name => $def) { if ((string) (int) $name === (string) $name) { $postfix = $def instanceof Statement && is_string($def->getEntity()) ? '.' . $def->getEntity() : (is_scalar($def) ? ".{$def}" : ''); $name = count($builder->getDefinitions()) + 1 . preg_replace('#\\W+#', '_', $postfix); } elseif ($namespace) { $name = $namespace . '.' . $name; } $params = $builder->parameters; if (is_array($def) && isset($def['parameters'])) { foreach ((array) $def['parameters'] as $k => $v) { $v = explode(' ', is_int($k) ? $v : $k); $params[end($v)] = $builder::literal('$' . end($v)); } } $def = Helpers::expand($def, $params); if (($parent = Config\Helpers::takeParent($def)) && $parent !== $name) { $builder->removeDefinition($name); $definition = $builder->addDefinition($name, $parent === Config\Helpers::OVERWRITE ? NULL : unserialize(serialize($builder->getDefinition($parent)))); } elseif ($builder->hasDefinition($name)) { $definition = $builder->getDefinition($name); } else { $definition = $builder->addDefinition($name); } try { static::parseService($definition, $def); } catch (\Exception $e) { throw new ServiceCreationException("Service '{$name}': " . $e->getMessage(), 0, $e); } } }
/** * Parses section 'services' from (unexpanded) configuration file. * @return void */ public static function parseServices(ContainerBuilder $builder, array $config, $namespace = NULL) { $services = isset($config['services']) ? $config['services'] : array(); $factories = isset($config['factories']) ? $config['factories'] : array(); $all = array_merge($services, $factories); uasort($all, function ($a, $b) { return strcmp(Config\Helpers::isInheriting($a), Config\Helpers::isInheriting($b)); }); if (!empty($config['factories'])) { trigger_error("Section 'factories' is deprecated, move definitions to section 'services' and append key 'autowired: no'.", E_USER_DEPRECATED); } foreach ($all as $origName => $def) { if ((string) (int) $origName === (string) $origName) { $name = count($builder->getDefinitions()) . preg_replace('#\\W+#', '_', $def instanceof \stdClass ? ".{$def->value}" : (is_scalar($def) ? ".{$def}" : '')); } elseif (array_key_exists($origName, $services) && array_key_exists($origName, $factories)) { throw new ServiceCreationException("It is not allowed to use services and factories with the same name: '{$origName}'."); } else { $name = ($namespace ? $namespace . '.' : '') . strtr($origName, '\\', '_'); } $params = $builder->parameters; if (is_array($def) && isset($def['parameters'])) { foreach ((array) $def['parameters'] as $k => $v) { $v = explode(' ', is_int($k) ? $v : $k); $params[end($v)] = $builder::literal('$' . end($v)); } } $def = Helpers::expand($def, $params); if (($parent = Config\Helpers::takeParent($def)) && $parent !== $name) { $builder->removeDefinition($name); $definition = $builder->addDefinition($name, $parent === Config\Helpers::OVERWRITE ? NULL : unserialize(serialize($builder->getDefinition($parent)))); } elseif ($builder->hasDefinition($name)) { $definition = $builder->getDefinition($name); } else { $definition = $builder->addDefinition($name); } try { static::parseService($definition, $def); } catch (\Exception $e) { throw new ServiceCreationException("Service '{$name}': " . $e->getMessage(), NULL, $e); } if (array_key_exists($origName, $factories)) { $definition->setAutowired(FALSE); } if ($definition->class === 'self') { $definition->class = $origName; trigger_error("Replace service definition '{$origName}: self' with '- {$origName}'.", E_USER_DEPRECATED); } if ($definition->factory && $definition->factory->entity === 'self') { $definition->factory->entity = $origName; trigger_error("Replace service definition '{$origName}: self' with '- {$origName}'.", E_USER_DEPRECATED); } } }
/** * Parses section 'services' from configuration file. * * @return void */ public static function parseServices(Nette\DI\ContainerBuilder $container, array $config, $namespace = null) { $services = isset($config['services']) ? $config['services'] : array(); $factories = isset($config['factories']) ? $config['factories'] : array(); if ($tmp = array_intersect_key($services, $factories)) { $tmp = implode("', '", array_keys($tmp)); throw new Nette\DI\ServiceCreationException("It is not allowed to use services and factories with the same names: '{$tmp}'."); } $all = $services + $factories; uasort($all, function ($a, $b) { return strcmp(Helpers::isInheriting($a), Helpers::isInheriting($b)); }); foreach ($all as $name => $def) { $shared = array_key_exists($name, $services); $name = ($namespace ? $namespace . '.' : '') . $name; if (($parent = Helpers::takeParent($def)) && $parent !== $name) { $container->removeDefinition($name); $definition = $container->addDefinition($name); if ($parent !== Helpers::OVERWRITE) { foreach ($container->getDefinition($parent) as $k => $v) { $definition->{$k} = unserialize(serialize($v)); // deep clone } } } elseif ($container->hasDefinition($name)) { $definition = $container->getDefinition($name); if ($definition->shared !== $shared) { throw new Nette\DI\ServiceCreationException("It is not allowed to use service and factory with the same name '{$name}'."); } } else { $definition = $container->addDefinition($name); } try { static::parseService($definition, $def, $shared); } catch (\Exception $e) { throw new Nette\DI\ServiceCreationException("Service '{$name}': " . $e->getMessage(), null, $e); } } }
/** * Parses section 'services' from (unexpanded) configuration file. * @return void */ public static function parseServices(ContainerBuilder $builder, array $config, $namespace = NULL) { if (!empty($config['factories'])) { throw new Nette\DeprecatedException("Section 'factories' is deprecated, move definitions to section 'services' and append key 'autowired: no'."); } $services = isset($config['services']) ? $config['services'] : array(); $depths = array(); foreach ($services as $name => $def) { $path = array(); while (Config\Helpers::isInheriting($def)) { $path[] = $def; $def = isset($services[$def[Config\Helpers::EXTENDS_KEY]]) ? $services[$def[Config\Helpers::EXTENDS_KEY]] : array(); if (in_array($def, $path, TRUE)) { throw new ServiceCreationException("Circular reference detected for service '{$name}'."); } } $depths[$name] = count($path); } array_multisort($depths, $services); foreach ($services as $origName => $def) { if ((string) (int) $origName === (string) $origName) { $postfix = $def instanceof Statement && is_string($def->getEntity()) ? '.' . $def->getEntity() : (is_scalar($def) ? ".{$def}" : ''); $name = count($builder->getDefinitions()) + 1 . preg_replace('#\\W+#', '_', $postfix); } else { $name = ($namespace ? $namespace . '.' : '') . strtr($origName, '\\', '_'); } $params = $builder->parameters; if (is_array($def) && isset($def['parameters'])) { foreach ((array) $def['parameters'] as $k => $v) { $v = explode(' ', is_int($k) ? $v : $k); $params[end($v)] = $builder::literal('$' . end($v)); } } $def = Helpers::expand($def, $params); if (($parent = Config\Helpers::takeParent($def)) && $parent !== $name) { $builder->removeDefinition($name); $definition = $builder->addDefinition($name, $parent === Config\Helpers::OVERWRITE ? NULL : unserialize(serialize($builder->getDefinition($parent)))); } elseif ($builder->hasDefinition($name)) { $definition = $builder->getDefinition($name); } else { $definition = $builder->addDefinition($name); } try { static::parseService($definition, $def); } catch (\Exception $e) { throw new ServiceCreationException("Service '{$name}': " . $e->getMessage(), NULL, $e); } if ($definition->getClass() === 'self' || $definition->getFactory() && $definition->getFactory()->getEntity() === 'self') { throw new Nette\DeprecatedException("Replace service definition '{$origName}: self' with '- {$origName}'."); } } }
/** * @param \Nette\DI\ContainerBuilder $builder */ private function setupProxyAuthorizator(ContainerBuilder $builder) { if ($default = $builder->getByType('Nette\\Security\\IAuthorizator')) { $builder->getDefinition($default)->setAutowired(FALSE); $builder->getDefinition($this->prefix('proxy'))->addSetup('setAuthorizator', ['@' . $default]); } else { $builder->removeDefinition($this->prefix('proxy')); } }
static function parseServices(Nette\DI\ContainerBuilder $container, array $config) { $all = isset($config['services']) ? $config['services'] : array(); $all += isset($config['factories']) ? $config['factories'] : array(); uasort($all, function ($a, $b) { return strcmp(Config::isInheriting($a), Config::isInheriting($b)); }); foreach ($all as $name => $def) { if ($parent = Config::takeParent($def)) { $container->removeDefinition($name); $definition = $container->addDefinition($name); if ($parent !== Config::OVERWRITE) { foreach ($container->getDefinition($parent) as $k => $v) { $definition->{$k} = $v; } } } elseif ($container->hasDefinition($name)) { $definition = $container->getDefinition($name); } else { $definition = $container->addDefinition($name); } try { static::parseService($definition, $def, isset($config['services'][$name])); } catch (\Exception $e) { throw new Nette\DI\ServiceCreationException("Service '{$name}': " . $e->getMessage(), NULL, $e); } } }