[ Index ]

PHP Cross Reference of phpBB-3.3.14-deutsch

title

Body

[close]

/vendor/ocramius/proxy-manager/src/ProxyManager/ProxyGenerator/ -> AccessInterceptorScopeLocalizerGenerator.php (source)

   1  <?php
   2  
   3  declare(strict_types=1);
   4  
   5  namespace ProxyManager\ProxyGenerator;
   6  
   7  use ProxyManager\Exception\InvalidProxiedClassException;
   8  use ProxyManager\Generator\Util\ClassGeneratorUtils;
   9  use ProxyManager\Proxy\AccessInterceptorInterface;
  10  use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor;
  11  use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor;
  12  use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors;
  13  use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors;
  14  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\BindProxyProperties;
  15  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\InterceptedMethod;
  16  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicClone;
  17  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicGet;
  18  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicIsset;
  19  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSet;
  20  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicSleep;
  21  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\MagicUnset;
  22  use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizer\MethodGenerator\StaticProxyConstructor;
  23  use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
  24  use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
  25  use ReflectionClass;
  26  use ReflectionMethod;
  27  use Zend\Code\Generator\ClassGenerator;
  28  use Zend\Code\Generator\MethodGenerator;
  29  use Zend\Code\Reflection\MethodReflection;
  30  
  31  /**
  32   * Generator for proxies implementing {@see \ProxyManager\Proxy\ValueHolderInterface}
  33   * and localizing scope of the proxied object at instantiation
  34   *
  35   * {@inheritDoc}
  36   *
  37   * @author Marco Pivetta <ocramius@gmail.com>
  38   * @license MIT
  39   */
  40  class AccessInterceptorScopeLocalizerGenerator implements ProxyGeneratorInterface
  41  {
  42      /**
  43       * {@inheritDoc}
  44       *
  45       * @throws \InvalidArgumentException
  46       * @throws InvalidProxiedClassException
  47       * @throws \Zend\Code\Generator\Exception\InvalidArgumentException
  48       */
  49      public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
  50      {
  51          CanProxyAssertion::assertClassCanBeProxied($originalClass, false);
  52  
  53          $classGenerator->setExtendedClass($originalClass->getName());
  54          $classGenerator->setImplementedInterfaces([AccessInterceptorInterface::class]);
  55          $classGenerator->addPropertyFromGenerator($prefixInterceptors = new MethodPrefixInterceptors());
  56          $classGenerator->addPropertyFromGenerator($suffixInterceptors = new MethodSuffixInterceptors());
  57  
  58          array_map(
  59              function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
  60                  ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
  61              },
  62              array_merge(
  63                  array_map(
  64                      $this->buildMethodInterceptor($prefixInterceptors, $suffixInterceptors),
  65                      ProxiedMethodsFilter::getProxiedMethods(
  66                          $originalClass,
  67                          ['__get', '__set', '__isset', '__unset', '__clone', '__sleep']
  68                      )
  69                  ),
  70                  [
  71                      new StaticProxyConstructor($originalClass),
  72                      new BindProxyProperties($originalClass, $prefixInterceptors, $suffixInterceptors),
  73                      new SetMethodPrefixInterceptor($prefixInterceptors),
  74                      new SetMethodSuffixInterceptor($suffixInterceptors),
  75                      new MagicGet($originalClass, $prefixInterceptors, $suffixInterceptors),
  76                      new MagicSet($originalClass, $prefixInterceptors, $suffixInterceptors),
  77                      new MagicIsset($originalClass, $prefixInterceptors, $suffixInterceptors),
  78                      new MagicUnset($originalClass, $prefixInterceptors, $suffixInterceptors),
  79                      new MagicSleep($originalClass, $prefixInterceptors, $suffixInterceptors),
  80                      new MagicClone($originalClass, $prefixInterceptors, $suffixInterceptors),
  81                  ]
  82              )
  83          );
  84      }
  85  
  86      private function buildMethodInterceptor(
  87          MethodPrefixInterceptors $prefixInterceptors,
  88          MethodSuffixInterceptors $suffixInterceptors
  89      ) : callable {
  90          return function (ReflectionMethod $method) use ($prefixInterceptors, $suffixInterceptors) : InterceptedMethod {
  91              return InterceptedMethod::generateMethod(
  92                  new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
  93                  $prefixInterceptors,
  94                  $suffixInterceptors
  95              );
  96          };
  97      }
  98  }


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