diff --git a/application/Espo/Classes/AppInfo/Binding.php b/application/Espo/Classes/AppInfo/Binding.php new file mode 100644 index 0000000000..9cf519c233 --- /dev/null +++ b/application/Espo/Classes/AppInfo/Binding.php @@ -0,0 +1,121 @@ +fileManager = $fileManager; + } + + public function process(array $options, array $flagList) : ?string + { + $result = ''; + + $bindingLoader = new EspoBindingLoader( + new Module($this->fileManager) + ); + + $data = $bindingLoader->load(); + + $keyList = $data->getGlobalKeyList(); + + $result .= "Global:\n\n"; + + foreach ($keyList as $key) { + $result .= $this->printItem($key, $data->getGlobal($key)); + } + + $contextList = $data->getContextList(); + + foreach ($contextList as $context) { + $result .= "Context: {$context}\n\n"; + + $keyList = $data->getContextKeyList($context); + + foreach ($keyList as $key) { + $result .= $this->printItem($key, $data->getContext($context, $key), true); + } + } + + return $result; + } + + private function printItem(string $key, BindingItem $binding) : string + { + $result = ''; + + $tab = ' '; + + $result .= $tab . "Key: {$key}\n"; + + $type = $binding->getType(); + $value = $binding->getValue(); + + $typeString = [ + BindingItem::IMPLEMENTATION_CLASS_NAME => 'Implementation', + BindingItem::CONTAINER_SERVICE => 'Service', + BindingItem::VALUE => 'Value', + BindingItem::CALLBACK => 'Callback', + ][$type]; + + $result .= $tab . "Type: {$typeString}\n"; + + if ($type == BindingItem::IMPLEMENTATION_CLASS_NAME || $type == BindingItem::CONTAINER_SERVICE) { + $result .= $tab . "Value: {$value}\n"; + } + + if ($type == BindingItem::VALUE) { + if (is_string($value) || is_int($value) || is_float($value)) { + $result .= $tab . "Value: {$value}\n"; + } + + if (is_bool($value)) { + $valueString = $value ? 'true' : 'false'; + + $result .= $tab . "Value: {$valueString}\n"; + } + } + + $result .= "\n"; + + return $result; + } +} diff --git a/application/Espo/Classes/AppInfo/Container.php b/application/Espo/Classes/AppInfo/Container.php new file mode 100644 index 0000000000..74fb0de6d9 --- /dev/null +++ b/application/Espo/Classes/AppInfo/Container.php @@ -0,0 +1,107 @@ +container = $container; + $this->metadata = $metadata; + } + + public function process(array $options, array $flagList) : ?string + { + $nameOnly = in_array('nameOnly', $flagList); + + $result = ''; + + $serviceList = [ + 'injectableFactory', + 'config', + 'log', + 'fileManager', + 'dataManager', + 'metadata', + 'user', + ]; + + $fileList = scandir('application/Espo/Core/Loaders'); + + if (file_exists('custom/Espo/Custom/Core/Loaders')) { + $fileList = array_merge($fileList, scandir('custom/Espo/Custom/Core/Loaders')); + } + + foreach ($fileList as $file) { + if (substr($file, -4) === '.php') { + $name = lcfirst(substr($file, 0, -4)); + + if (!in_array($name, $serviceList) && $this->container->has($name)) { + $serviceList[] = $name; + } + } + } + + foreach ($this->metadata->get(['app', 'containerServices']) ?? [] as $name => $data) { + if (!in_array($name, $serviceList)) { + $serviceList[] = $name; + } + } + + sort($serviceList); + + if ($nameOnly) { + foreach ($serviceList as $name) { + $result .= $name . "\n"; + } + + return $result; + } + + foreach ($serviceList as $name) { + $result .= $name . "\n"; + + $obj = $this->container->get($name); + $result .= get_class($obj) . "\n"; + + $result .= "\n"; + } + + return $result; + } +} diff --git a/application/Espo/Core/Binding/BindingData.php b/application/Espo/Core/Binding/BindingData.php index ab78334f9f..1f0d5995e8 100644 --- a/application/Espo/Core/Binding/BindingData.php +++ b/application/Espo/Core/Binding/BindingData.php @@ -96,4 +96,25 @@ class BindingData return $this->global->$key; } + + public function getGlobalKeyList() : array + { + return array_keys( + get_object_vars($this->global) + ); + } + + public function getContextList() : array + { + return array_keys( + get_object_vars($this->context) + ); + } + + public function getContextKeyList(string $context) : array + { + return array_keys( + get_object_vars($this->context->$context ?? (object) []) + ); + } } diff --git a/application/Espo/Core/Console/Commands/AppInfo.php b/application/Espo/Core/Console/Commands/AppInfo.php index 22b1afe721..8697ebf5a3 100644 --- a/application/Espo/Core/Console/Commands/AppInfo.php +++ b/application/Espo/Core/Console/Commands/AppInfo.php @@ -29,72 +29,57 @@ namespace Espo\Core\Console\Commands; -use Espo\Core\Container; -use Espo\Core\Utils\Metadata; +use Espo\Core\{ + InjectableFactory, + Utils\File\Manager as FileManager, +}; class AppInfo implements Command { - protected $container; - protected $metadata; + protected $injectableFactory; + protected $fileManager; - public function __construct(Container $container, Metadata $metadata) + public function __construct(InjectableFactory $injectableFactory, FileManager $fileManager) { - $this->container = $container; - $this->metadata = $metadata; + $this->injectableFactory = $injectableFactory; + $this->fileManager = $fileManager; } public function run(array $options, array $flagList) { - if (in_array('container', $flagList)) { - $this->printContainerInfo(in_array('nameOnly', $flagList)); - } - } + $fileList = $this->fileManager->getFileList('application/Espo/Classes/AppInfo'); - protected function printContainerInfo(bool $nameOnly = false) - { - $serviceList = [ - 'injectableFactory', 'config', 'log', 'fileManager', 'dataManager', 'metadata', 'user', - ]; + $typeList = array_map(function ($item) { + return lcfirst(substr($item, 0, -4)); + }, $fileList); - $fileList = scandir('application/Espo/Core/Loaders'); + foreach ($typeList as $type) { + if (in_array($type, $flagList)) { + $this->processType($type, $options, $flagList); - if (file_exists('custom/Espo/Custom/Core/Loaders')) { - $fileList = array_merge($fileList, scandir('custom/Espo/Custom/Core/Loaders')); - } - - foreach ($fileList as $file) { - if (substr($file, -4) === '.php') { - $name = lcfirst(substr($file, 0, -4)); - - if (!in_array($name, $serviceList) && $this->container->has($name)) { - $serviceList[] = $name; - } + return; } } - foreach ($this->metadata->get(['app', 'containerServices']) ?? [] as $name => $data) { - if (!in_array($name, $serviceList)) { - $serviceList[] = $name; - } - } + if (empty($flagList)) { + echo "No parameters specified.\n"; - - sort($serviceList); - - if ($nameOnly) { - foreach ($serviceList as $name) { - echo $name . "\n"; - } return; } - foreach ($serviceList as $name) { - echo $name . "\n"; + echo "Bad parameters specified.\n"; + } - $obj = $this->container->get($name); - echo get_class($obj) . "\n"; + protected function processType(string $type, array $options, array $flagList) + { + $className = 'Espo\\Classes\\AppInfo\\' . ucfirst($type); - echo "\n"; + $obj = $this->injectableFactory->create($className); + + $result = $obj->process($options, $flagList); + + if ($result) { + echo $result; } } }