[ Index ]

PHP Cross Reference of phpBB-3.3.14-deutsch

title

Body

[close]

/vendor/ocramius/proxy-manager/src/ProxyManager/Factory/ -> AbstractBaseFactory.php (source)

   1  <?php
   2  
   3  declare(strict_types=1);
   4  
   5  namespace ProxyManager\Factory;
   6  
   7  use ProxyManager\Configuration;
   8  use ProxyManager\Generator\ClassGenerator;
   9  use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
  10  use ProxyManager\Signature\Exception\InvalidSignatureException;
  11  use ProxyManager\Signature\Exception\MissingSignatureException;
  12  use ProxyManager\Version;
  13  use ReflectionClass;
  14  
  15  /**
  16   * Base factory common logic
  17   *
  18   * @author Marco Pivetta <ocramius@gmail.com>
  19   * @license MIT
  20   */
  21  abstract class AbstractBaseFactory
  22  {
  23      /**
  24       * @var \ProxyManager\Configuration
  25       */
  26      protected $configuration;
  27  
  28      /**
  29       * Cached checked class names
  30       *
  31       * @var string[]
  32       */
  33      private $checkedClasses = [];
  34  
  35      /**
  36       * @param \ProxyManager\Configuration $configuration
  37       */
  38      public function __construct(Configuration $configuration = null)
  39      {
  40          $this->configuration = $configuration ?: new Configuration();
  41      }
  42  
  43      /**
  44       * Generate a proxy from a class name
  45       *
  46       * @param string  $className
  47       * @param mixed[] $proxyOptions
  48       *
  49       * @throws InvalidSignatureException
  50       * @throws MissingSignatureException
  51       * @throws \OutOfBoundsException
  52       */
  53      protected function generateProxy(string $className, array $proxyOptions = []) : string
  54      {
  55          if (\array_key_exists($className, $this->checkedClasses)) {
  56              return $this->checkedClasses[$className];
  57          }
  58  
  59          $proxyParameters = [
  60              'className'           => $className,
  61              'factory'             => get_class($this),
  62              'proxyManagerVersion' => Version::getVersion(),
  63              'proxyOptions'        => $proxyOptions,
  64          ];
  65          $proxyClassName  = $this
  66              ->configuration
  67              ->getClassNameInflector()
  68              ->getProxyClassName($className, $proxyParameters);
  69  
  70          if (! class_exists($proxyClassName)) {
  71              $this->generateProxyClass(
  72                  $proxyClassName,
  73                  $className,
  74                  $proxyParameters,
  75                  $proxyOptions
  76              );
  77          }
  78  
  79          $this
  80              ->configuration
  81              ->getSignatureChecker()
  82              ->checkSignature(new ReflectionClass($proxyClassName), $proxyParameters);
  83  
  84          return $this->checkedClasses[$className] = $proxyClassName;
  85      }
  86  
  87      abstract protected function getGenerator() : ProxyGeneratorInterface;
  88  
  89      /**
  90       * Generates the provided `$proxyClassName` from the given `$className` and `$proxyParameters`
  91       *
  92       * @param string  $proxyClassName
  93       * @param string  $className
  94       * @param array   $proxyParameters
  95       * @param mixed[] $proxyOptions
  96       */
  97      private function generateProxyClass(
  98          string $proxyClassName,
  99          string $className,
 100          array $proxyParameters,
 101          array $proxyOptions = []
 102      ) : void {
 103          $className = $this->configuration->getClassNameInflector()->getUserClassName($className);
 104          $phpClass  = new ClassGenerator($proxyClassName);
 105  
 106          $this->getGenerator()->generate(new ReflectionClass($className), $phpClass, $proxyOptions);
 107  
 108          $phpClass = $this->configuration->getClassSignatureGenerator()->addSignature($phpClass, $proxyParameters);
 109  
 110          $this->configuration->getGeneratorStrategy()->generate($phpClass, $proxyOptions);
 111  
 112          $autoloader = $this->configuration->getProxyAutoloader();
 113  
 114          $autoloader($proxyClassName);
 115      }
 116  }


Generated: Mon Nov 25 19:05:08 2024 Cross-referenced by PHPXref 0.7.1