/** * Reindex everything in elastic search. */ public function reindexAll() { $this->deleteIndex(); $this->createIndex(); $this->itemDao->applyOnAllItemName(function ($item) { echo "Indexing " . $item['name'] . "\n"; $this->storeItemName($item['name'], $item['type']); }); $this->packageDao->applyOnAllPackages(function ($item) { if (isset($item['packageName'])) { echo "Indexing " . $item['packageName'] . "\n"; $this->storeItemName($item['packageName'], 'package'); } }); }
/** * Returns the list of classes/interfaces/traits that inherits/extends the class/interface/trait passed * in parameter. * Result is returned as a JSON result. * * @URL api/v1/inherits * @Get * @param string $q */ public function inherits($q) { // Remove front \ $q = ltrim($q, '\\'); $graphItems = $this->findItemsInheriting($q); $rootNodesCollection = $this->itemDao->getItemsByName($q); // If there is no root node (for instance if the class is "Exception") if ($rootNodesCollection->count() == 0) { // If this class has never been used, we might want to wonder if the class exists at all. if (count($graphItems) == 0) { // Let's go on a 404. return new JsonResponse(["status" => "error", "message" => "Item '{$q}' does not exist."], 404); } $rootNodes = [["name" => $q]]; } else { $rootNodes = []; foreach ($rootNodesCollection as $key => $item) { $rootNodes[$key] = $item; $packageName = $item['packageName']; if (!isset($this->packagesCache[$packageName])) { $this->packagesCache[$packageName] = $this->packageDao->getPackagesByName($packageName)->getNext(); } $rootNodes[$key]['package'] = $this->packagesCache[$packageName]; } } $graph = new Graph($rootNodes, $graphItems); // Let's extract the PHPDoc from the latest version (dev version): foreach ($rootNodes as $rootNode) { if (isset($rootNode['packageVersion']) && strpos($rootNode['packageVersion'], "-dev") !== false) { break; } } if ($rootNode && isset($rootNode['phpDoc'])) { $docBlock = new MoufPhpDocComment($rootNode['phpDoc']); $md = $docBlock->getComment(); $description = MarkdownExtra::defaultTransform($md); // Let's purify HTML to avoid any attack: $config = \HTMLPurifier_Config::createDefault(); $purifier = new \HTMLPurifier($config); $description = $purifier->purify($description); } else { $description = ''; } if ($rootNode && isset($rootNode['type'])) { $type = $rootNode['type']; } else { $type = "class"; } // Let's compute the pointer to the source. if (isset($rootNode['packageName'])) { // TODO: improve to get the link to the best package $package = $this->packageDao->get($rootNode['packageName'], $rootNode['packageVersion']); $sourceUrl = null; if (isset($package['sourceUrl']) && strpos($package['sourceUrl'], 'https://github.com') === 0) { if (strpos($package['sourceUrl'], '.git') === strlen($package['sourceUrl']) - 4) { if (isset($rootNode['fileName']) && $rootNode['fileName']) { $sourceUrl = substr($package['sourceUrl'], 0, strlen($package['sourceUrl']) - 4); $version = str_replace(['dev-', '.x-dev'], ['', ''], $package['packageVersion']); $sourceUrl .= '/blob/' . $version . $rootNode['fileName']; } } } } else { $sourceUrl = null; } // Now, let's find all the classes/interfaces we extend from (recursively...) $inheritNodes = $this->getNode($q); // Compute the revert depth of all elements. $inheritNodes->getRevertDepth(); // We put the graph of the extending classes INTO the revert graph of the classes we extend from. $inheritNodes->replaceNodeRenderingWith($graph); // Finally, let's get the list of classes/interfaces/traits/functions using this item $usedInItems = $this->itemDao->findItemsUsing($q)->limit(1000); // Let's add the twig file to the template. $this->template->setTitle('Packanalyst | ' . ucfirst($type) . ' ' . $q); $this->template->getWebLibraryManager()->addLibrary(new WebLibrary([ROOT_URL . 'src/views/classAnalyzer/classAnalyzer.js'])); \Mouf::getSearchBlock()->setSearch($q); $this->content->addHtmlElement(new TwigTemplate($this->twig, 'src/views/classAnalyzer/index.twig', array("class" => $q, "description" => $description, "type" => $type, "inheritNodesHtml" => $inheritNodes->getHtmlRevert(), "sourceUrl" => $sourceUrl, "usedInItems" => $usedInItems))); $this->template->toHtml(); }