public function testXml() { $builder = new DefinitionBuilder(new ParameterBuilder()); $builder->addDefinition(\PDO::class)->defineConstructor()->defineParameter('dsn')->defineDependency(new StringReference('mysql:host=localhost;port=3306;dbname=stylelike.io;charset=UTF8'))->end()->defineParameter('username')->defineDependency(new StringReference('samsonos'))->end()->defineParameter('passwd')->defineDependency(new StringReference('AzUzrcVe4LJJre9f'))->end()->defineParameter('options')->defineDependency((new CollectionReference())->addItem(new CollectionItem(new ConstantReference('\\PDO::ATTR_ERRMODE'), new ParameterReference('pdo_exception')))->addItem(new CollectionItem(new ConstantReference('\\PDO::ATTR_DEFAULT_FETCH_MODE'), new ConstantReference('\\PDO::FETCH_ASSOC'))))->end()->end()->end()->addDefinition(XmlProductClass::class)->defineConstructor()->defineParameter('shoes')->defineDependency(new ClassReference(Shoes::class))->end()->defineParameter('val')->defineDependency(new StringReference('value'))->end()->defineParameter('val1')->defineDependency(new StringReference('value1'))->end()->defineParameter('arr')->defineDependency(new CollectionReference(['param' => 'value']))->end()->end()->defineMethod('setLeg')->defineParameter('driver')->defineDependency(new ClassReference(SlowDriver::class))->end()->end()->defineProperty('driver')->defineDependency(new ClassReference(SlowDriver::class))->end()->end(); $definitionBuilder = new DefinitionBuilder(new ParameterBuilder()); $resolver = new XmlResolver(); $resolver->resolve($definitionBuilder, $this->getMainXml()); static::assertCount(2, $definitionBuilder->getDefinitionCollection()); static::assertCount(1, $definitionBuilder->getParameterCollection()); }
/** * Load modules * * @throws \Exception */ public function init() { $containerPath = __DIR__ . '/../../../../../www/cache'; $containerName = 'ContainerCore'; $containerNamespace = 'samsonphp\\core\\loader'; /** @var Module $module */ $modules = $this->moduleManager->getRegisteredModules(); $localModulesPath = '../src'; ResourceMap::get('cache'); $resourceMap = ResourceMap::get($localModulesPath); $localModules = $resourceMap->modules; if (false || !file_exists($containerPath . '/' . $containerName . '.php')) { $builder = new DefinitionBuilder(new ParameterBuilder()); $xmlResolver = new XmlResolver(); $xmlResolver->resolveFile($builder, __DIR__ . '/../../../../../app/config/config.xml'); new Service(''); new InjectService(''); new InjectClass(''); new InjectParameter(''); foreach ($modules as $module) { if ($module->className && !$builder->hasDefinition($module->className)) { // Fix samson.php files if (!class_exists($module->className)) { require_once $module->pathName; } /** @var ClassDefinition $classDefinition */ $classDefinition = $builder->addDefinition($module->className); if ($id = $this->getModuleId($module->pathName)) { $classDefinition->setServiceName($id); } else { // Generate identifier from module class $classDefinition->setServiceName(strtolower(ltrim(str_replace(__NS_SEPARATOR__, '_', $module->className), '_'))); } $classDefinition->addScope(new ModuleScope())->setIsSingleton(true); $this->defineConstructor($classDefinition, $module->path); } } $classDefinition = $builder->addDefinition(VirtualModule::class); $classDefinition->addScope(new ModuleScope())->setServiceName('local')->setIsSingleton(true); $this->defineConstructor($classDefinition, getcwd()); foreach ($localModules as $moduleFile) { if (!$builder->hasDefinition($moduleFile[0])) { /** @var ClassDefinition $classDefinition */ $classDefinition = $builder->addDefinition($moduleFile[0]); $classDefinition->addScope(new ModuleScope()); $classDefinition->setIsSingleton(true); if ($id = $this->getModuleId($moduleFile[1])) { $classDefinition->setServiceName($id); } else { throw new \Exception('Can not get id of local module'); } $modulePath = explode('/', str_replace(realpath($localModulesPath), '', $moduleFile[1])); $this->defineConstructor($classDefinition, $localModulesPath . '/' . $modulePath[1]); } } /** * Add implementors */ foreach ($this->moduleManager->implements as $interfaceName => $class) { $builder->defineImplementors($interfaceName, new ClassReference($class)); } // Init compiler $reader = new AnnotationReader(); $compiler = new DefinitionCompiler(new DefinitionGenerator(new ClassGenerator()), (new DefinitionAnalyzer())->addClassAnalyzer(new AnnotationClassAnalyzer($reader))->addClassAnalyzer(new ReflectionClassAnalyzer())->addMethodAnalyzer(new AnnotationMethodAnalyzer($reader))->addMethodAnalyzer(new ReflectionMethodAnalyzer())->addPropertyAnalyzer(new AnnotationPropertyAnalyzer($reader))->addPropertyAnalyzer(new ReflectionPropertyAnalyzer())->addParameterAnalyzer(new ReflectionParameterAnalyzer())); $container = $compiler->compile($builder, $containerName, $containerNamespace, $containerPath); } else { $containerClassName = $containerNamespace . '\\' . $containerName; require_once $containerPath . '/' . $containerName . '.php'; $container = new $containerClassName(); } $GLOBALS['__core'] = $container->get('core'); $this->prepareModules($modules, $container); /** @var array $module */ foreach ($localModules as $module) { $instance = $container->get($module[0]); $instance->parent = $this->getClassParentModule($container, get_parent_class($instance)); } // $container->get('core')->active($container->get('local')); return $container; }