X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fdrupal%2Fconsole%2Fsrc%2FCommand%2FDebug%2FContainerCommand.php;fp=vendor%2Fdrupal%2Fconsole%2Fsrc%2FCommand%2FDebug%2FContainerCommand.php;h=17e2bcf63a3ee87ccd66f8212249d87007c7491c;hp=0000000000000000000000000000000000000000;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/vendor/drupal/console/src/Command/Debug/ContainerCommand.php b/vendor/drupal/console/src/Command/Debug/ContainerCommand.php new file mode 100644 index 000000000..17e2bcf63 --- /dev/null +++ b/vendor/drupal/console/src/Command/Debug/ContainerCommand.php @@ -0,0 +1,298 @@ +setName('debug:container') + ->setDescription($this->trans('commands.debug.container.description')) + ->addOption( + 'parameters', + null, + InputOption::VALUE_NONE, + $this->trans('commands.debug.container.arguments.service') + ) + ->addArgument( + 'service', + InputArgument::OPTIONAL, + $this->trans('commands.debug.container.arguments.service') + )->addArgument( + 'method', + InputArgument::OPTIONAL, + $this->trans('commands.debug.container.arguments.method') + )->addArgument( + 'arguments', + InputArgument::OPTIONAL, + $this->trans('commands.debug.container.arguments.arguments') + )->addOption( + 'tag', + null, + InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL, + $this->trans('commands.debug.container.options.tag') + ) + ->setAliases(['dco']); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $service = $input->getArgument('service'); + $parameters = $input->getOption('parameters'); + $tag = $input->getOption('tag'); + $method = $input->getArgument('method'); + $args = $input->getArgument('arguments'); + + if ($parameters) { + $parameterList = $this->getParameterList(); + ksort($parameterList); + $this->getIo()->write(Yaml::dump(['parameters' => $parameterList], 4, 2)); + + return 0; + } + + if ($method) { + $tableHeader = []; + $callbackRow = $this->getCallbackReturnList($service, $method, $args); + $this->getIo()->table($tableHeader, $callbackRow, 'compact'); + + return 0; + } else { + $tableHeader = []; + if ($service) { + $tableRows = $this->getServiceDetail($service); + $this->getIo()->table($tableHeader, $tableRows, 'compact'); + + return 0; + } + + $tableHeader = [ + $this->trans('commands.debug.container.messages.service-id'), + $this->trans('commands.debug.container.messages.class-name') + ]; + $tableRows = $this->getServiceList($tag); + $this->getIo()->table($tableHeader, $tableRows, 'compact'); + } + + return 0; + } + + private function getCallbackReturnList($service, $method, $args) + { + if ($args != null) { + $parsedArgs = json_decode($args, true); + if (!is_array($parsedArgs)) { + $parsedArgs = explode(",", $args); + } + } else { + $parsedArgs = null; + } + $serviceInstance = \Drupal::service($service); + + if (!method_exists($serviceInstance, $method)) { + throw new \Symfony\Component\DependencyInjection\Exception\BadMethodCallException($this->trans('commands.debug.container.errors.method-not-exists')); + + return $serviceDetail; + } + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.service').'', + ''.$service.'' + ]; + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.class').'', + ''.get_class($serviceInstance).'' + ]; + $methods = [$method]; + $this->extendArgumentList($serviceInstance, $methods); + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.method').'', + ''.$methods[0].'' + ]; + if ($parsedArgs) { + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.arguments').'', + json_encode($parsedArgs, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) + ]; + } + $return = call_user_func_array([$serviceInstance,$method], $parsedArgs); + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.return').'', + json_encode($return, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) + ]; + return $serviceDetail; + } + + private function getServiceList($tag) + { + if ($tag) { + return $this->getServiceListByTag($tag); + } + + $services = []; + $serviceDefinitions = $this->container->getDefinitions(); + + foreach ($serviceDefinitions as $serviceId => $serviceDefinition) { + $services[] = [$serviceId, $serviceDefinition->getClass()]; + } + usort($services, [$this, 'compareService']); + return $services; + } + + private function getServiceListByTag($tag) + { + $services = []; + $serviceIds = []; + $serviceDefinitions = $this->container->getDefinitions(); + + foreach ($tag as $tagId) { + $serviceIds = array_merge( + $serviceIds, + array_keys($this->container->findTaggedServiceIds($tagId)) + ); + } + + foreach ($serviceIds as $serviceId) { + $serviceDefinition = $serviceDefinitions[$serviceId]; + if ($serviceDefinition) { + $services[] = [$serviceId, $serviceDefinition->getClass()]; + } + } + + usort($services, [$this, 'compareService']); + return $services; + } + + private function compareService($a, $b) + { + return strcmp($a[0], $b[0]); + } + + private function getServiceDetail($service) + { + $serviceInstance = $this->get($service); + $serviceDetail = []; + + if ($serviceInstance) { + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.service').'', + ''.$service.'' + ]; + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.class').'', + ''.get_class($serviceInstance).'' + ]; + $interface = str_replace("{ }", "", Yaml::dump(class_implements($serviceInstance))); + if (!empty($interface)) { + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.interface').'', + ''.$interface.'' + ]; + } + if ($parent = get_parent_class($serviceInstance)) { + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.parent').'', + ''.$parent.'' + ]; + } + if ($vars = get_class_vars($serviceInstance)) { + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.variables').'', + ''.Yaml::dump($vars).'' + ]; + } + if ($methods = get_class_methods($serviceInstance)) { + sort($methods); + $this->extendArgumentList($serviceInstance, $methods); + $serviceDetail[] = [ + ''.$this->trans('commands.debug.container.messages.methods').'', + ''.implode("\n", $methods).'' + ]; + } + } else { + throw new \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException($service); + + return $serviceDetail; + } + + return $serviceDetail; + } + private function extendArgumentList($serviceInstance, &$methods) + { + foreach ($methods as $k => $m) { + $reflection = new \ReflectionMethod($serviceInstance, $m); + $params = $reflection->getParameters(); + $p = []; + + for ($i = 0; $i < count($params); $i++) { + if ($params[$i]->isDefaultValueAvailable()) { + $defaultVar = $params[$i]->getDefaultValue(); + $defaultVar = " = ".str_replace(["\n","array ("], ["", "array("], var_export($def, true)).''; + } else { + $defaultVar = ''; + } + if (method_exists($params[$i], 'hasType') && method_exists($params[$i], 'getType')) { + if ($params[$i]->hasType()) { + $defaultType = ''.strval($params[$i]->getType()).' '; + } else { + $defaultType = ''; + } + } else { + $defaultType = ''; + } + if ($params[$i]->isPassedByReference()) { + $parameterReference = '&'; + } else { + $parameterReference = ''; + } + $p[] = $defaultType.$parameterReference.''.'$'.$params[$i]->getName().''.$defaultVar; + } + if ($reflection->isPublic()) { + $methods[$k] = ''.$methods[$k]."(".implode(', ', $p).") "; + } + } + } + + private function getParameterList() + { + $parameters = array_filter( + $this->container->getParameterBag()->all(), function ($name) { + if (preg_match('/^container\./', $name)) { + return false; + } + if (preg_match('/^drupal\./', $name)) { + return false; + } + if (preg_match('/^console\./', $name)) { + return false; + } + return true; + }, ARRAY_FILTER_USE_KEY + ); + + return $parameters; + } +}