vendor/ocramius/proxy-manager/src/ProxyManager/Factory/AbstractBaseFactory.php line 62

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