Inheritance: extends Nette\Object
Example #1
0
 /**
  * @param \Nette\DI\ContainerBuilder $container
  * @param array $config
  */
 private function setupTemplating(ContainerBuilder $container, array $config)
 {
     $def = $container->addDefinition($this->prefix('templateFilesFormatter'))->setClass('Lohini\\Templating\\TemplateFilesFormatter')->addSetup('$skin', [$config['skin']]);
     foreach ($config['dirs'] as $dir => $priority) {
         $def->addSetup('addDir', Validators::isNumericInt($dir) ? [$priority] : [$container->expand($dir), $priority]);
     }
 }
Example #2
0
 private function addWebLoader(\Nette\DI\ContainerBuilder $builder, $name, $config)
 {
     $filesServiceName = $this->prefix($name . 'Files');
     $files = $builder->addDefinition($filesServiceName)->setClass('WebLoader\\FileCollection')->setArguments(array($config['sourceDir']));
     foreach ($config['files'] as $file) {
         // finder support
         if (is_array($file) && isset($file['files']) && (isset($file['in']) || isset($file['from']))) {
             $finder = \Nette\Utils\Finder::findFiles($file['files']);
             unset($file['files']);
             foreach ($file as $method => $params) {
                 call_user_func_array(array($finder, $method), array($params));
             }
             foreach ($finder as $foundFile) {
                 $files->addSetup('addFile', array((string) $foundFile));
             }
         } else {
             $files->addSetup('addFile', array($file));
         }
     }
     $files->addSetup('addRemoteFiles', array($config['remoteFiles']));
     $compiler = $builder->addDefinition($this->prefix($name . 'Compiler'))->setClass('WebLoader\\Compiler')->setArguments(array('@' . $filesServiceName, $config['namingConvention'], $config['tempDir']));
     $compiler->addSetup('setJoinFiles', array($config['joinFiles']));
     foreach ($config['filters'] as $filter) {
         $compiler->addSetup('addFilter', array($filter));
     }
     foreach ($config['fileFilters'] as $filter) {
         $compiler->addSetup('addFileFilter', array($filter));
     }
     // todo css media
 }
Example #3
0
 private function addWebLoader(ContainerBuilder $builder, $name, $config)
 {
     $filesServiceName = $this->prefix($name . 'Files');
     $files = $builder->addDefinition($filesServiceName)->setClass('WebLoader\\FileCollection')->setArguments(array($config['sourceDir']));
     foreach ($this->findFiles($config['files'], $config['sourceDir']) as $file) {
         $files->addSetup('addFile', array($file));
     }
     foreach ($this->findFiles($config['watchFiles'], $config['sourceDir']) as $file) {
         $files->addSetup('addWatchFile', array($file));
     }
     $files->addSetup('addRemoteFiles', array($config['remoteFiles']));
     $compiler = $builder->addDefinition($this->prefix($name . 'Compiler'))->setClass('WebLoader\\Compiler')->setArguments(array('@' . $filesServiceName, $config['namingConvention'], $config['tempDir']));
     $compiler->addSetup('setJoinFiles', array($config['joinFiles']));
     if ($builder->parameters['webloader']['debugger']) {
         $compiler->addSetup('@' . $this->prefix('tracyPanel') . '::addLoader', array($name, '@' . $this->prefix($name . 'Compiler')));
     }
     foreach ($config['filters'] as $filter) {
         $compiler->addSetup('addFilter', array($filter));
     }
     foreach ($config['fileFilters'] as $filter) {
         $compiler->addSetup('addFileFilter', array($filter));
     }
     if (isset($config['debug']) && $config['debug']) {
         $compiler->addSetup('enableDebugging');
     }
     $compiler->addSetup('setCheckLastModified', array($config['checkLastModified']));
     // todo css media
 }
Example #4
0
 protected function createRepositoryService($repositoryData, ContainerBuilder $builder, $mapperName)
 {
     $repositoryName = $this->prefix('repositories.' . $repositoryData['name']);
     if (!$builder->hasDefinition($repositoryName)) {
         $builder->addDefinition($repositoryName)->setClass($repositoryData['class'])->setArguments(['@' . $mapperName, '@' . $this->prefix('dependencyProvider')])->addSetup('onModelAttach', ['@' . $this->prefix('model')]);
     }
 }
Example #5
0
 private function setupCompileTemplatesCommand(ContainerBuilder $builder, array $config)
 {
     $config = $this->validateConfig($this->compileTemplatesDefaults, $config, 'compileTemplates');
     Validators::assertField($config, 'source', 'string|array');
     $builder->addDefinition($this->prefix('compileTemplates'))->setClass(CompileTemplatesCommand::class, [array_map(function ($directory) use($builder) {
         Validators::assert($directory, 'string');
         return Helpers::expand($directory, $builder->parameters);
     }, (array) $config['source'])])->addTag(ConsoleExtension::TAG_COMMAND)->setAutowired(false);
 }
Example #6
0
 /**
  * @param ContainerBuilder $builder
  * @return array
  */
 private function getSortedConfigurators(ContainerBuilder $builder)
 {
     $configurators = $builder->findByTag(self::TAG_CONFIGURATOR);
     uasort($configurators, function ($a, $b) {
         $a = is_numeric($a) ? (double) $a : 0;
         $b = is_numeric($b) ? (double) $b : 0;
         return $a < $b ? -1 : ($a > $b ? 1 : 0);
     });
     return $configurators;
 }
 /**
  * Adds mapper service into container
  * @return ServiceDefinition
  */
 protected function configMapper(ContainerBuilder $builder, array $config)
 {
     if ($config['defaultEntityNamespace'] !== NULL && !is_string($config['defaultEntityNamespace'])) {
         throw new \RuntimeException('DefaultEntityNamespace must be NULL or string, ' . gettype($config['defaultEntityNamespace']) . ' given');
     }
     $mapper = $builder->addDefinition($this->prefix('mapper'))->setClass($config['mapper'], array($config['defaultEntityNamespace']));
     $this->processEntityProviders($mapper, $config);
     $this->processUserEntities($mapper, $config);
     return $mapper;
 }
Example #8
0
 /**
  * @param ContainerBuilder $container
  * @param string $type
  * @return ServiceDefinition|null
  */
 private function getByType(ContainerBuilder $container, $type)
 {
     $definitionas = $container->getDefinitions();
     foreach ($definitionas as $definition) {
         if ($definition->class === $type) {
             return $definition;
         }
     }
     return NULL;
 }
Example #9
0
 public function install(Nette\DI\ContainerBuilder $builder)
 {
     foreach ($this->listener as $class_name => $on) {
         $definition = $builder->getDefinition("annevents." . $class_name);
         foreach ($on as $on_name => $data) {
             foreach ($data['call'] as $add) {
                 $definition->addSetup('$service->' . $on_name . '[]=?->' . $add['method'], array($builder->getDefinition('annevents.' . str_replace('\\', '_', $add['class']))));
             }
         }
     }
 }
 private function createSubscribersMap(\Nette\DI\ContainerBuilder $builder)
 {
     $map = [];
     foreach ($builder->findByTag(self::TAG_SUBSCRIBER) as $serviceName => $tagProperties) {
         $def = $builder->getDefinition($serviceName);
         $class = $def->getClass();
         $events = $class::getSubscribedEvents();
         foreach ($events as $eventName => $callbacks) {
             foreach ($callbacks as $function) {
                 $map[$eventName][] = [$serviceName, $function];
             }
         }
     }
     return $map;
 }
Example #11
0
 /**
  * @param  Nette\DI\ContainerBuilder $builder
  * @return array
  */
 private function findRoutes(Nette\DI\ContainerBuilder $builder)
 {
     /**
      * Find all presenters and their routes
      */
     $presenters = $builder->findByTag('nette.presenter');
     $routes = [];
     foreach ($presenters as $presenter) {
         $this->findRoutesInPresenter($presenter, $routes);
     }
     /**
      * Return routes sorted by priority
      */
     return $this->sortByPriority($routes);
 }
Example #12
0
 public function generateCode($className, $parentName)
 {
     foreach ($this->extensions as $extension) {
         $extension->beforeCompile();
         $this->container->addDependency(Nette\Reflection\ClassType::from($extension)->getFileName());
     }
     $classes[] = $class = $this->container->generateClass($parentName);
     $class->setName($className)->addMethod('initialize');
     foreach ($this->extensions as $extension) {
         $extension->afterCompile($class);
     }
     $defs = $this->container->getDefinitions();
     ksort($defs);
     $list = array_keys($defs);
     foreach (array_reverse($defs, true) as $name => $def) {
         if ($def->class === 'Nette\\DI\\NestedAccessor' && ($found = preg_grep('#^' . $name . '\\.#i', $list))) {
             $list = array_diff($list, $found);
             $def->class = $className . '_' . preg_replace('#\\W+#', '_', $name);
             $class->documents = preg_replace("#\\S+(?= \\\${$name}\$)#", $def->class, $class->documents);
             $classes[] = $accessor = new Nette\Utils\PhpGenerator\ClassType($def->class);
             foreach ($found as $item) {
                 if ($defs[$item]->internal) {
                     continue;
                 }
                 $short = substr($item, strlen($name) + 1);
                 $accessor->addDocument($defs[$item]->shared ? "@property {$defs[$item]->class} \${$short}" : "@method {$defs[$item]->class} create" . ucfirst("{$short}()"));
             }
         }
     }
     return implode("\n\n\n", $classes);
 }
Example #13
0
 /**
  * @param ContainerBuilder $container
  * @param array $config
  */
 private function processAuthenticators(ContainerBuilder $container, array $config)
 {
     $authentication = $container->addDefinition($this->prefix('authentication'))->setClass('Flame\\Rest\\Security\\Authentication');
     if (!$container->parameters['debugMode'] && count($config['ips'])) {
         $ipAuthenticator = $container->addDefinition($this->prefix('ipAuthenticator'))->setClass('Flame\\Rest\\Security\\Authenticators\\IpAuthenticator')->setArguments(array($config['ips']));
         $authentication->addSetup('addAuthenticator', array($ipAuthenticator));
     }
     if (!$container->parameters['debugMode'] && count($config['referers'])) {
         $refererAuthenticator = $container->addDefinition($this->prefix('refererAuthenticator'))->setClass('Flame\\Rest\\Security\\Authenticators\\RefererAuthenticator')->setArguments(array($config['referers']));
         $authentication->addSetup('addAuthenticator', array($refererAuthenticator));
     }
     foreach ($config['authenticators'] as $k => $authenticatorConfig) {
         $authenticator = $container->addDefinition($this->prefix('authenticator' . $k))->setClass($authenticatorConfig);
         $authentication->addSetup('addAuthenticator', array($authenticator));
     }
 }
Example #14
0
 private function prepareNetteDatabase(\Nette\DI\ContainerBuilder $builder)
 {
     $ndbConnectionSectionKeys = ['dsn' => NULL, 'user' => NULL, 'password' => NULL];
     /** @var \Nette\DI\CompilerExtension $extension */
     foreach ($this->compiler->getExtensions('Nette\\Bridges\\DatabaseDI\\DatabaseExtension') as $extension) {
         if (array_intersect_key($extension->config, $ndbConnectionSectionKeys)) {
             $extensionConfig = $extension->config;
             $definitionName = $extension->name . '.default.connection';
             $builder->getDefinition($definitionName)->setClass('Testbench\\Mocks\\NetteDatabaseConnectionMock', [$extensionConfig['dsn'], $extensionConfig['user'], $extensionConfig['password'], isset($extensionConfig['options']) ? $extensionConfig['options'] + ['lazy' => TRUE] : []]);
         } else {
             foreach ($extension->config as $sectionName => $sectionConfig) {
                 $definitionName = $extension->name . '.' . $sectionName . '.connection';
                 $builder->getDefinition($definitionName)->setClass('Testbench\\Mocks\\NetteDatabaseConnectionMock', [$sectionConfig['dsn'], $sectionConfig['user'], $sectionConfig['password'], isset($sectionConfig['options']) ? $sectionConfig['options'] + ['lazy' => TRUE] : []]);
             }
         }
     }
 }
Example #15
0
 /**
  * Routes definition
  *
  * @param ContainerBuilder $container Container
  * @param array            $config    Config
  *
  * @return void
  */
 protected function loadRoutes(ContainerBuilder $container, $config)
 {
     $container->addDefinition($this->prefix('storages'))->setClass('MouseOver\\Storage\\Application\\StorageList');
     $container->addDefinition($this->prefix('responder'))->setClass('MouseOver\\Storage\\Application\\StorageResponder');
     $container->addDefinition($this->prefix('linkResolver'))->setClass('MouseOver\\Storage\\Application\\StorageLinkResolver', [$config['module']]);
     $container->getDefinition('nette.latte')->addSetup('MouseOver\\Storage\\Application\\StorageMacros::install($service->getCompiler(), ?)', array($this->prefix('@linkResolver')));
     $routesList = $container->addDefinition($this->prefix('storageRoutes'))->setClass('Nette\\Application\\Routers\\RouteList')->setAutowired(false);
     $routesList->addSetup('$service[] = new Nette\\Application\\Routers\\Route(?, function ($presenter, $storage, $file) { return ?->handle($storage, $file, $presenter->request->getParameters()); })', array($config['module'] . '/<storage>/<file [a-zA-Z0-9\\-_.\\/]+>', $this->prefix('@responder')));
     $container->getDefinition('router')->addSetup('MouseOver\\Storage\\DI\\StorageExtension::prependTo($service, ?)', [$this->prefix('@storageRoutes')]);
 }
 /**
  * @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;
     }
 }
Example #17
0
 /**
  * @param ContainerBuilder $builder
  * @throws \movi\InvalidArgumentException
  */
 private function processPackages(ContainerBuilder $builder)
 {
     $manager = $builder->getDefinition($this->prefix('manager'));
     $packages = $builder->parameters['packages'];
     if (count($packages) > 0) {
         foreach (array_values($packages) as $data) {
             $class = $this->getPackageClass($data);
             if (class_exists($class)) {
                 $package = new $class($data);
                 if (!$package instanceof Package) {
                     throw new InvalidArgumentException("Package class must be an instance of movi\\Packages\\Package.");
                 }
             } else {
                 $package = new Package($data);
             }
             // Compile the package
             $package->onCompile($this->compiler);
             $this->processExtensions($package->extensions);
             $manager->addSetup('addPackage', [$package]);
         }
     }
 }
Example #18
0
 private function setupDatabase(ContainerBuilder $container, array $config)
 {
     if (isset($config['dsn'])) {
         $config = array('default' => $config);
     }
     $autowired = true;
     foreach ((array) $config as $name => $info) {
         if (!is_array($info)) {
             continue;
         }
         $this->validate($info, $this->databaseDefaults, 'flunorette');
         $info += array('autowired' => $autowired) + $this->databaseDefaults;
         $autowired = false;
         foreach (array('transactionCounter', 'delimiteMode', 'lazy', 'driverClass') as $option) {
             if (isset($info[$option])) {
                 $info['options'][$option] = $info[$option];
             }
         }
         foreach ((array) $info['options'] as $key => $value) {
             if (preg_match('#^PDO::\\w+\\z#', $key)) {
                 unset($info['options'][$key]);
                 $info['options'][constant($key)] = $value;
             }
         }
         if (!$info['reflection']) {
             $reflection = null;
         } elseif (is_string($info['reflection'])) {
             $reflection = new Statement(preg_match('#^[a-z]+\\z#', $info['reflection']) ? 'Flunorette\\Reflections\\' . ucfirst($info['reflection']) . 'Reflection' : $info['reflection'], strtolower($info['reflection']) === 'discovered' ? array('@self') : array());
         } else {
             $tmp = Compiler::filterArguments(array($info['reflection']));
             $reflection = reset($tmp);
         }
         $connection = $container->addDefinition($this->prefix($name))->setClass('Flunorette\\Connection', array($info['dsn'], $info['user'], $info['password'], $info['options']))->setAutowired($info['autowired'])->addSetup('setCacheStorage')->addSetup('Nette\\Diagnostics\\Debugger::getBlueScreen()->addPanel(?)', array('Flunorette\\Bridges\\Nette\\Diagnostics\\ConnectionPanel::renderException'));
         if ($container->parameters['debugMode'] && $info['debugger']) {
             $connection->addSetup('Flunorette\\Helpers::createDebugPanel', array($connection, !empty($info['explain']), $name));
         }
     }
 }
Example #19
0
 /**
  * Formats PHP code for class instantiating, function calling or property setting in PHP.
  * @return string
  */
 private function formatStatement(Statement $statement)
 {
     $entity = $statement->getEntity();
     $arguments = $statement->arguments;
     if (is_string($entity) && Strings::contains($entity, '?')) {
         // PHP literal
         return $this->formatPhp($entity, $arguments);
     } elseif ($service = $this->builder->getServiceName($entity)) {
         // factory calling
         return $this->formatPhp('$this->?(?*)', [Container::getMethodName($service), $arguments]);
     } elseif ($entity === 'not') {
         // operator
         return $this->formatPhp('!?', [$arguments[0]]);
     } elseif (is_string($entity)) {
         // class name
         return $this->formatPhp("new {$entity}" . ($arguments ? '(?*)' : ''), [$arguments]);
     } elseif ($entity[0] === '') {
         // globalFunc
         return $this->formatPhp("{$entity['1']}(?*)", [$arguments]);
     } elseif ($entity[0] instanceof Statement) {
         $inner = $this->formatPhp('?', [$entity[0]]);
         if (substr($inner, 0, 4) === 'new ') {
             $inner = "({$inner})";
         }
         return $this->formatPhp("{$inner}->?(?*)", [$entity[1], $arguments]);
     } elseif ($entity[1][0] === '$') {
         // property getter, setter or appender
         $name = substr($entity[1], 1);
         if ($append = substr($name, -2) === '[]') {
             $name = substr($name, 0, -2);
         }
         if ($this->builder->getServiceName($entity[0])) {
             $prop = $this->formatPhp('?->?', [$entity[0], $name]);
         } else {
             $prop = $this->formatPhp($entity[0] . '::$?', [$name]);
         }
         return $arguments ? $this->formatPhp($prop . ($append ? '[]' : '') . ' = ?', [$arguments[0]]) : $prop;
     } elseif ($service = $this->builder->getServiceName($entity[0])) {
         // service method
         return $this->formatPhp('?->?(?*)', [$entity[0], $entity[1], $arguments]);
     } else {
         // static method
         return $this->formatPhp("{$entity['0']}::{$entity['1']}(?*)", [$arguments]);
     }
 }
Example #20
0
 /**
  * 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);
         }
     }
 }
Example #21
0
 public function setupSecurity(ContainerBuilder $container)
 {
     $container->addDefinition($this->prefix('defaultPresenter'))->setClass('Venne\\Security\\AdminModule\\DefaultPresenter')->addTag(SystemExtension::TAG_ADMINISTRATION, array('link' => 'Admin:Security:Default:', 'category' => 'System', 'name' => 'Security', 'description' => 'Manage users, roles and permissions', 'priority' => 60));
     $container->addDefinition($this->prefix('accountPresenter'))->setClass('Venne\\Security\\AdminModule\\AccountPresenter');
 }
Example #22
0
 public function setupSystem(ContainerBuilder $container, array $config)
 {
     $container->addDefinition($this->prefix('formRenderer'))->setClass('Venne\\System\\Forms\\Bootstrap3Renderer');
     $container->addDefinition($this->prefix('admin.basicFormFactory'))->setClass('Nette\\Application\\UI\\Form')->setArguments(array(null, null))->setImplement('Venne\\Forms\\IFormFactory')->addSetup('setRenderer', array(new Statement($this->prefix('@formRenderer'))))->addSetup('setTranslator', array(new Statement('@Nette\\Localization\\ITranslator')))->setAutowired(false);
     $container->addDefinition($this->prefix('admin.ajaxFormFactory'))->setClass('Nette\\Application\\UI\\Form')->setArguments(array(null, null))->setImplement('Venne\\Forms\\IFormFactory')->addSetup('setRenderer', array(new Statement($this->prefix('@formRenderer'))))->addSetup('setTranslator', array(new Statement('@Nette\\Localization\\ITranslator')))->addSetup('$service->getElementPrototype()->class[] = ?', array('ajax'))->setAutowired(false);
     $container->addDefinition($this->prefix('admin.configFormFactory'))->setClass('Venne\\System\\UI\\ConfigFormFactory', array(new PhpLiteral('$configFile'), new PhpLiteral('$section')))->addSetup('setFormFactory', array(new Statement('@system.admin.basicFormFactory')))->setAutowired(false)->setParameters(array('configFile', 'section'));
     $container->addDefinition($this->prefix('registrationControlFactory'))->setClass('Venne\\Security\\Registration\\RegistrationControl', array(new PhpLiteral('$invitations'), new PhpLiteral('$userType'), new PhpLiteral('$mode'), new PhpLiteral('$loginProviderMode'), new PhpLiteral('$roles')))->setImplement('Venne\\Security\\Registration\\IRegistrationControlFactory')->setInject(true);
     $container->addDefinition($this->prefix('system.loginFormFactory'))->setClass('Venne\\System\\AdminModule\\LoginFormFactory', array(new Statement('@system.admin.basicFormFactory')));
     $container->addDefinition($this->prefix('system.dashboardPresenter'))->setClass('Venne\\System\\AdminModule\\DashboardPresenter');
     $container->addDefinition($this->prefix('cssControlFactory'))->setClass('Venne\\System\\Components\\CssControl')->setImplement('Venne\\System\\Components\\CssControlFactory')->setArguments(array(null))->setInject(true);
     $container->addDefinition($this->prefix('jsControlFactory'))->setClass('Venne\\System\\Components\\JsControl')->setImplement('Venne\\System\\Components\\JsControlFactory')->setArguments(array(null))->setInject(true);
     $container->addDefinition($this->prefix('navbarControlFactory'))->setImplement('Venne\\System\\Components\\INavbarControlFactory')->setArguments(array(null))->setInject(true);
     $container->addDefinition($this->prefix('loginControlFactory'))->setImplement('Venne\\Security\\Login\\ILoginControlFactory')->setInject(true);
     $container->addDefinition($this->prefix('gridoFactory'))->setImplement('Venne\\System\\Components\\IGridoFactory')->setArguments(array(null, null))->setInject(true);
     $container->addDefinition($this->prefix('gridControlFactory'))->setImplement('Venne\\System\\Components\\AdminGrid\\IAdminGridFactory')->setArguments(array(new PhpLiteral('$repository')))->setParameters(array('repository'))->setInject(true);
     $container->addDefinition($this->prefix('flashMessageControlFactory'))->setImplement('Venne\\System\\Components\\IFlashMessageControlFactory')->setArguments(array(null))->setInject(true)->addTag(WidgetsExtension::TAG_WIDGET, 'flashMessage');
 }
Example #23
0
 /**
  * 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);
         }
     }
 }
Example #24
0
 /**
  * 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);
         }
     }
 }
 private function loadDefinitions(ContainerBuilder $builder)
 {
     $classes = $this->robotLoader->getIndexedClasses();
     $markerInterface = new ClassType(IServiceMarker::class);
     foreach ($classes as $key => $val) {
         if (Strings::endsWith($key, 'Service')) {
             $reflection = new ClassType($key);
             $serviceName = '_auto.' . str_replace("\\", "_", $key);
             if (!$reflection->isAbstract() && $reflection->isSubclassOf($markerInterface)) {
                 $builder->addDefinition($serviceName)->setClass($key);
             }
         }
     }
 }
Example #26
0
 /**
  * Formats PHP statement.
  * @return string
  * @internal
  */
 public function formatPhp($statement, $args)
 {
     $that = $this;
     array_walk_recursive($args, function (&$val) use($that) {
         if ($val instanceof Statement) {
             $val = ContainerBuilder::literal($that->formatStatement($val));
         } elseif ($val === $that) {
             $val = ContainerBuilder::literal('$this');
         } elseif ($val instanceof ServiceDefinition) {
             $val = '@' . current(array_keys($that->getDefinitions(), $val, TRUE));
         }
         if (!is_string($val)) {
             return;
         } elseif (substr($val, 0, 2) === '@@') {
             $val = substr($val, 1);
         } elseif (substr($val, 0, 1) === '@' && strlen($val) > 1) {
             $pair = explode('::', $val, 2);
             $name = $that->getServiceName($pair[0]);
             if (isset($pair[1]) && preg_match('#^[A-Z][A-Z0-9_]*\\z#', $pair[1], $m)) {
                 $val = $that->getDefinition($name)->getClass() . '::' . $pair[1];
             } else {
                 if ($name === ContainerBuilder::THIS_CONTAINER) {
                     $val = '$this';
                 } elseif ($name === $that->currentService) {
                     $val = '$service';
                 } else {
                     $val = $that->formatStatement(new Statement(array('@' . ContainerBuilder::THIS_CONTAINER, 'getService'), array($name)));
                 }
                 $val .= isset($pair[1]) ? PhpHelpers::formatArgs('->?', array($pair[1])) : '';
             }
             $val = ContainerBuilder::literal($val);
         }
     });
     return PhpHelpers::formatArgs($statement, $args);
 }
Example #27
0
 /**
  * @param ContainerBuilder $containerBuilder
  *
  * @return \Nette\DI\ServiceDefinition
  */
 protected function createTimestampStorage(ContainerBuilder $containerBuilder)
 {
     return $containerBuilder->addDefinition($this->prefix('timestampStorage'))->setAutowired(FALSE)->setInject(FALSE);
 }
Example #28
0
 private function setupDatabase(ContainerBuilder $container, array $config)
 {
     if (isset($config['dsn'])) {
         $config = array('default' => $config);
     }
     $autowired = TRUE;
     foreach ((array) $config as $name => $info) {
         if (!is_array($info)) {
             continue;
         }
         $info += $this->databaseDefaults + array('autowired' => $autowired);
         $autowired = FALSE;
         foreach ((array) $info['options'] as $key => $value) {
             if (preg_match('#^PDO::\\w+\\z#', $key)) {
                 unset($info['options'][$key]);
                 $info['options'][constant($key)] = $value;
             }
         }
         if (!$info['reflection']) {
             $reflection = NULL;
         } elseif (is_string($info['reflection'])) {
             $reflection = new Nette\DI\Statement(preg_match('#^[a-z]+\\z#', $info['reflection']) ? 'Nette\\Database\\Reflection\\' . ucfirst($info['reflection']) . 'Reflection' : $info['reflection'], strtolower($info['reflection']) === 'discovered' ? array('@self') : array());
         } else {
             $tmp = Nette\DI\Compiler::filterArguments(array($info['reflection']));
             $reflection = reset($tmp);
         }
         $connection = $container->addDefinition($this->prefix("database.{$name}"))->setClass('Nette\\Database\\Connection', array($info['dsn'], $info['user'], $info['password'], $info['options']))->setAutowired($info['autowired'])->addSetup('setContext', array(new Nette\DI\Statement('Nette\\Database\\Context', array('@self', $reflection))))->addSetup('Nette\\Diagnostics\\Debugger::getBlueScreen()->addPanel(?)', array('Nette\\Database\\Diagnostics\\ConnectionPanel::renderException'));
         $container->addDefinition($this->prefix("database.{$name}.context"))->setClass('Nette\\Database\\Context')->setFactory(array($connection, 'getContext'))->setAutowired($info['autowired']);
         if ($container->parameters['debugMode'] && $info['debugger']) {
             $connection->addSetup('Nette\\Database\\Helpers::createDebugPanel', array($connection, !empty($info['explain']), $name));
         }
     }
 }
Example #29
0
 /**
  * Loads configuration from file and process it.
  * @return DI\Container
  */
 public function loadConfig($file, $section = NULL)
 {
     if ($file === NULL) {
         $file = $this->defaultConfigFile;
     }
     $container = $this->container;
     $file = $container->expand($file);
     if (!is_file($file)) {
         $file = preg_replace('#\\.neon$#', '.ini', $file);
         // back compatibility
     }
     if ($section === NULL) {
         if (PHP_SAPI === 'cli') {
             $section = Environment::CONSOLE;
         } else {
             $section = $container->params['productionMode'] ? Environment::PRODUCTION : Environment::DEVELOPMENT;
         }
     }
     $cache = new Cache($container->templateCacheStorage, 'Nette.Configurator');
     $cacheKey = array((array) $container->params, $file, $section);
     $cached = $cache->load($cacheKey);
     if ($cached) {
         require $cached['file'];
         fclose($cached['handle']);
         return $this->container;
     }
     $config = Nette\Config\Config::fromFile($file, $section);
     $code = "<?php\n// source file {$file}\n\n";
     // back compatibility with singular names
     foreach (array('service', 'variable') as $item) {
         if (isset($config[$item])) {
             trigger_error(basename($file) . ": Section '{$item}' is deprecated; use plural form '{$item}s' instead.", E_USER_WARNING);
             $config[$item . 's'] = $config[$item];
             unset($config[$item]);
         }
     }
     // process services
     if (isset($config['services'])) {
         foreach ($config['services'] as $key => &$def) {
             if (preg_match('#^Nette\\\\.*\\\\I?([a-zA-Z]+)$#', strtr($key, '-', '\\'), $m)) {
                 // back compatibility
                 $m[1][0] = strtolower($m[1][0]);
                 trigger_error(basename($file) . ": service name '{$key}' has been renamed to '{$m['1']}'", E_USER_WARNING);
                 $key = $m[1];
             }
             if (is_array($def)) {
                 if (method_exists(get_called_class(), "createService{$key}") && !isset($def['factory']) && !isset($def['class'])) {
                     $def['factory'] = array(get_called_class(), "createService{$key}");
                 }
                 if (isset($def['option'])) {
                     $def['arguments'][] = $def['option'];
                 }
                 if (!empty($def['run'])) {
                     $def['tags'] = array('run');
                 }
             }
         }
         $builder = new DI\ContainerBuilder();
         $code .= $builder->generateCode($config['services']);
         unset($config['services']);
     }
     // consolidate variables
     if (!isset($config['variables'])) {
         $config['variables'] = array();
     }
     foreach ($config as $key => $value) {
         if (!in_array($key, array('variables', 'services', 'php', 'const', 'mode'))) {
             $config['variables'][$key] = $value;
         }
     }
     // pre-expand variables at compile-time
     $variables = $config['variables'];
     array_walk_recursive($config, function (&$val) use($variables) {
         $val = Configurator::preExpand($val, $variables);
     });
     // add variables
     foreach ($config['variables'] as $key => $value) {
         $code .= $this->generateCode('$container->params[?] = ?', $key, $value);
     }
     // PHP settings
     if (isset($config['php'])) {
         foreach ($config['php'] as $key => $value) {
             if (is_array($value)) {
                 // back compatibility - flatten INI dots
                 foreach ($value as $k => $v) {
                     $code .= $this->configurePhp("{$key}.{$k}", $v);
                 }
             } else {
                 $code .= $this->configurePhp($key, $value);
             }
         }
     }
     // define constants
     if (isset($config['const'])) {
         foreach ($config['const'] as $key => $value) {
             $code .= $this->generateCode('define', $key, $value);
         }
     }
     // set modes - back compatibility
     if (isset($config['mode'])) {
         foreach ($config['mode'] as $mode => $state) {
             trigger_error(basename($file) . ": Section 'mode' is deprecated; use '{$mode}Mode' in section 'variables' instead.", E_USER_WARNING);
             $code .= $this->generateCode('$container->params[?] = ?', $mode . 'Mode', (bool) $state);
         }
     }
     // pre-loading
     $code .= self::preloadEnvironment($container);
     // auto-start services
     $code .= 'foreach ($container->getServiceNamesByTag("run") as $name => $foo) { $container->getService($name); }' . "\n";
     $cache->save($cacheKey, $code, array(Cache::FILES => $file));
     Nette\Utils\LimitedScope::evaluate($code, array('container' => $container));
     return $this->container;
 }
Example #30
0
 /**
  * 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} = $v;
                 }
             }
         } 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);
         }
     }
 }