Files
popsu-d9/old.vendor/drupal/console/src/Command/Debug/HookCommand.php
2022-04-27 11:30:43 +02:00

199 lines
4.8 KiB
PHP

<?php
/**
* @file
* Contains \Drupal\Console\Command\Debug\HookCommand.
*/
namespace Drupal\Console\Command\Debug;
use Drupal\Console\Core\Command\Command;
use Drupal\Console\Extension\Manager;
use Drupal\Component\Utility;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Finder\Finder;
/**
* Class HookCommand.
*
* @package Drupal\Console\Command\Debug
*/
class HookCommand extends Command
{
/**
* @var Manager $extensionManager
*/
protected $extensionManager = null;
/**
* @var ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* @var array
*/
protected $hooks = [];
/**
* HookCommand constructor.
*
* @param Manager $extensionManager
* @param ModuleHandlerInterface $moduleHandler
*
*/
public function __construct(
Manager $extensionManager,
ModuleHandlerInterface $moduleHandler
) {
$this->extensionManager = $extensionManager;
$this->moduleHandler = $moduleHandler;
parent::__construct();
}
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
->setName('debug:hook')
->setDescription($this->trans('commands.debug.hook.description'))
->setAliases(['dbh']);
}
/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->findHooks();
$tableHeader = [
$this->trans('commands.debug.hook.messages.name'),
];
$this->getIo()->table($tableHeader, $this->getHooks(), 'compact');
return 0;
}
protected function findHooks()
{
$modules = $this->getAllModules();
$moduleInstances = [];
foreach ($modules as $module) {
$moduleInstance = $this->extensionManager->getModule($module);
if (empty($moduleInstance)) {
continue;
}
$moduleInstances[$module] = $moduleInstance;
$this->moduleHandler->setModuleList([$module => $moduleInstance]);
$this->findHooksInApiFile($moduleInstance);
}
$this->getHooksFromHookInfo($moduleInstances);
}
/**
* Get module of all modules in the system.
*
* @return array
* Module list.
*/
protected function getAllModules()
{
return $this->extensionManager->discoverModules()
->showInstalled()
->showUninstalled()
->showNoCore()
->showCore()
->getList(true);
}
/**
* Gets gooks from api file of the module.
*
* @param $moduleInstance
* Module instance.
*/
protected function findHooksInApiFile($moduleInstance)
{
$finder = new Finder();
$files = $finder->files()
->name("{$moduleInstance->info['name']}.api.php")
->in($moduleInstance->getPath());
foreach ($files as $file) {
$functions = $this->getFileFunctions($file->getPathname());
foreach ($functions as $function) {
if (Unicode::strpos($function, 'hook')) {
$this->addHook($function);
}
}
}
}
/**
* Get names of all functions from file.
*
* @param string $filePath
* File path
* @return array
* Functions list.
*/
protected function getFileFunctions($filePath)
{
$source = file_get_contents($filePath);
$tokens = token_get_all($source);
$functions = [];
$nextStringIsFunc = false;
foreach($tokens as $token) {
switch($token[0]) {
case T_FUNCTION:
$nextStringIsFunc = true;
break;
case T_STRING:
if ($nextStringIsFunc) {
$nextStringIsFunc = false;
$functions[] = $token[1];
}
break;
}
}
return $functions;
}
/**
* @param $modules
*/
protected function getHooksFromHookInfo($modules)
{
$this->moduleHandler->setModuleList($modules);
foreach(array_keys($this->moduleHandler->getHookInfo()) as $hook) {
$this->addHook('hook_' . $hook);
}
}
/**
* Add hook.
*
* @param string $value
* Hook name.
*/
protected function addHook($value)
{
$this->hooks[] = $value;
}
protected function getHooks()
{
return $this->hooks;
}
}