diff core/lib/Drupal/Core/Command/GenerateProxyClassCommand.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Command/GenerateProxyClassCommand.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,88 @@
+<?php
+
+namespace Drupal\Core\Command;
+
+use Drupal\Component\ProxyBuilder\ProxyBuilder;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Provides a console command to generate proxy classes.
+ */
+class GenerateProxyClassCommand extends Command {
+
+  /**
+   * The proxy builder.
+   *
+   * @var \Drupal\Component\ProxyBuilder\ProxyBuilder
+   */
+  protected $proxyBuilder;
+
+  /**
+   * Constructs a new GenerateProxyClassCommand instance.
+   *
+   * @param \Drupal\Component\ProxyBuilder\ProxyBuilder $proxy_builder
+   *   The proxy builder.
+   */
+  public function __construct(ProxyBuilder $proxy_builder) {
+    parent::__construct();
+
+    $this->proxyBuilder = $proxy_builder;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function configure() {
+    $this->setName('generate-proxy-class')
+      ->setDefinition([
+        new InputArgument('class_name', InputArgument::REQUIRED, 'The class to be proxied'),
+        new InputArgument('namespace_root_path', InputArgument::REQUIRED, 'The filepath to the root of the namespace.'),
+      ])
+      ->setDescription('Dumps a generated proxy class into its appropriate namespace.')
+      ->addUsage('\'Drupal\Core\Batch\BatchStorage\' "core/lib/Drupal/Core"')
+      ->addUsage('\'Drupal\block\BlockRepository\' "core/modules/block/src"')
+      ->addUsage('\'Drupal\mymodule\MyClass\' "modules/contrib/mymodule/src"');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function execute(InputInterface $input, OutputInterface $output) {
+    $class_name = ltrim($input->getArgument('class_name'), '\\');
+    $namespace_root = $input->getArgument('namespace_root_path');
+
+    $match = [];
+    preg_match('/([a-zA-Z0-9_]+\\\\[a-zA-Z0-9_]+)\\\\(.+)/', $class_name, $match);
+
+    if ($match) {
+      $root_namespace = $match[1];
+      $rest_fqcn = $match[2];
+
+      $proxy_filename = $namespace_root . '/ProxyClass/' . str_replace('\\', '/', $rest_fqcn) . '.php';
+      $proxy_class_name = $root_namespace . '\\ProxyClass\\' . $rest_fqcn;
+
+      $proxy_class_string = $this->proxyBuilder->build($class_name);
+
+      $file_string = <<<EOF
+<?php
+// @codingStandardsIgnoreFile
+
+/**
+ * This file was generated via php core/scripts/generate-proxy-class.php '$class_name' "$namespace_root".
+ */
+{{ proxy_class_string }}
+EOF;
+      $file_string = str_replace(['{{ proxy_class_name }}', '{{ proxy_class_string }}'], [$proxy_class_name, $proxy_class_string], $file_string);
+
+      mkdir(dirname($proxy_filename), 0775, TRUE);
+      file_put_contents($proxy_filename, $file_string);
+
+      $output->writeln(sprintf('Proxy of class %s written to %s', $class_name, $proxy_filename));
+    }
+
+  }
+
+}