/** * @param string $output file to generate */ public function generate($output) { $html = $this->twig->render('index.html.twig', array('title' => $this->specification->getTitle(), 'base_url' => $this->specification->getBaseUrl(), 'security' => $this->specification->getSecuritySchemes(), 'resources' => $this->specification->getResources(), 'documentation' => $this->specification->getDocumentationList(), 'base_dir_raml' => $this->base_dir_raml, 'version' => $this->specification->getVersion())); file_put_contents($output, $html); }
/** * @param string $ramlFile */ public function generateRest($ramlFile, Local $directoryOutput) { $parser = new Parser(); try { /* * file di routing symfony * @var array */ $routing = []; /* * Mappa delle proprieta dei controller da generare * @var array */ $mappaClassDef = []; $this->apiDef = $parser->parse($ramlFile); $this->logger->info('Title: ' . $this->apiDef->getTitle()); $baseUrl = $this->apiDef->getBaseUrl(); $parametriBaseUrl = $this->apiDef->getBaseUriParameters(); /** @var \Raml\BaseUriParameter $definition */ foreach ($parametriBaseUrl as $varName => $definition) { if (!array_key_exists($varName, $this->mapExternalInfo)) { $this->error('Missing: ' . $varName . ' -> ' . $definition->getDescription()); $this->mapExternalInfo[$varName] = 'undefined'; } $baseUrl = str_replace($varName, $this->mapExternalInfo[$varName], $baseUrl); } $this->info('BaseUrl ' . $baseUrl); //corrisponde a host: "{subdomain}.example.com" dentro routing.yml $enabledProtocols = $this->apiDef->getProtocols(); //serve per fare controlli su http/https -> schemes: [https] dentro routing.yml $infoSecuritySchema = $this->apiDef->getSecuredBy(); // descrive i vari security schema usati nelle varie risorse /* @var: \Raml\Resource[] */ $resources = $this->apiDef->getResources(); $namespace = $this->bundleName . '\\Controller'; /** @var: \Raml\Resource $resource */ foreach ($resources as $resource) { $displayName = $resource->getDisplayName(); $this->info('Controller per path: ' . $displayName); $names = explode('/', $displayName); preg_match_all("/(\\/{[a-zA-Z]+}(\\/)?)+/i", $displayName, $methodParam); array_walk($names, [$this, 'removeGraph']); $className = implode('', $names); $methods = $resource->getMethods(); if (count($methods) > 0) { /** @var \Raml\Method $method */ foreach ($methods as $method) { $controllerName = ucfirst($className); // Creo $appBundle / $workspace Controller . php $this->info('Genera: ' . $namespace . $controllerName . 'Controller'); $controllerProperties = []; $controllerProperties['name'] = $controllerName . 'Controller'; $controllerProperties['namespace'] = $namespace; $controllerProperties['extend'] = 'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller'; $methodListParams = implode(',', $methodParam[0]); $type = strtolower($method->getType()); $methodCallName = $type . $controllerName; $actionName = $methodCallName . 'Action'; $this->info('Call Method: ' . $actionName . '(' . $methodListParams . ')'); $controllerProperties['methods'] = []; $controllerProperties['methods'][$actionName] = []; $controllerProperties['methods'][$actionName]['params'] = []; $description = $method->getDescription(); $this->info('Description: ' . $description); $entryName = strtolower($className) . '_' . $type; $routing[$entryName]['path'] = $displayName; $routing[$entryName]['defaults']['_controller'] = $this->bundleName . ':' . $controllerName . ':' . $methodCallName; $routing[$entryName]['host'] = $baseUrl; $routing[$entryName]['methods'] = []; $routing[$entryName]['methods'][] = strtoupper($type); $routing[$entryName]['schemas'] = $enabledProtocols; $routing[$entryName]['requirements'] = []; $routing[$entryName]['requirements'][] = 'FIXME'; $mappaClassDef[$controllerName . 'Controller'] = $controllerProperties; } //fine methods } /* @var \Raml\Resource $subResources */ $subResources = $resource->getResources(); foreach ($subResources as $subResource) { //$this->analyzeResource($subResource, $directoryOutput); //// SAMPLE: // /Workspace GET => Workspace/GetWorkspace.php // /Workspace POST => Workspace/POSTWorkspace.php // /Workspace/{id} GET => Workspace/GetWorkspaceById.php } } //fine reousrces $indent = 4; $inline = 2; $yaml = new Dumper($indent); $this->currentFile = $yaml->dump($routing, $inline, 0, 0); $this->_createFileOnDir($directoryOutput, $this->bundleName . '/Resources/config/routing.yml'); foreach ($mappaClassDef as $className => $controllerProp) { $this->info('Devo creare ' . $className); $gClassgen = new ClassGenerator($namespace, $className); $gClassgen->setLogger($this->logger); $config = new ClassConfig(); $typesReferenceArray = []; $typesDescArray = []; $gClassgen->generateClassType($controllerProp, $typesReferenceArray, $typesDescArray, $config); $gClassgen->createFileOnDir($directoryOutput); } $this->info('Scrittura su ' . $directoryOutput); } catch (InvalidJsonException $e) { $this->error('[' . $e->getErrorCode() . '] ' . $e->getMessage()); $this->error($e->getTraceAsString()); } catch (RamlParserException $e) { $this->error('[' . $e->getErrorCode() . '] ' . $e->getMessage()); } }