Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

AccessInterceptorValueHolderGenerator.php

Zuletzt modifiziert: 02.04.2025, 15:03 - Dateigröße: 6.28 KiB


001  <?php
002   
003  declare(strict_types=1);
004   
005  namespace ProxyManager\ProxyGenerator;
006   
007  use ProxyManager\Exception\InvalidProxiedClassException;
008  use ProxyManager\Generator\Util\ClassGeneratorUtils;
009  use ProxyManager\Proxy\AccessInterceptorValueHolderInterface;
010  use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup;
011  use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodPrefixInterceptor;
012  use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\SetMethodSuffixInterceptor;
013  use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors;
014  use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors;
015  use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\InterceptedMethod;
016  use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicClone;
017  use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicGet;
018  use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicIsset;
019  use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicSet;
020  use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\MagicUnset;
021  use ProxyManager\ProxyGenerator\AccessInterceptorValueHolder\MethodGenerator\StaticProxyConstructor;
022  use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
023  use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty;
024  use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
025  use ProxyManager\ProxyGenerator\Util\Properties;
026  use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
027  use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\Constructor;
028  use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue;
029  use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\MagicSleep;
030  use ReflectionClass;
031  use ReflectionMethod;
032  use Zend\Code\Generator\ClassGenerator;
033  use Zend\Code\Generator\MethodGenerator;
034  use Zend\Code\Reflection\MethodReflection;
035   
036  /**
037   * Generator for proxies implementing {@see \ProxyManager\Proxy\ValueHolderInterface}
038   * and {@see \ProxyManager\Proxy\AccessInterceptorInterface}
039   *
040   * {@inheritDoc}
041   *
042   * @author Marco Pivetta <ocramius@gmail.com>
043   * @license MIT
044   */
045  class AccessInterceptorValueHolderGenerator implements ProxyGeneratorInterface
046  {
047      /**
048       * {@inheritDoc}
049       *
050       * @throws \InvalidArgumentException
051       * @throws InvalidProxiedClassException
052       * @throws \Zend\Code\Generator\Exception\InvalidArgumentException
053       */
054      public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
055      {
056          CanProxyAssertion::assertClassCanBeProxied($originalClass);
057   
058          $publicProperties = new PublicPropertiesMap(Properties::fromReflectionClass($originalClass));
059          $interfaces       = [AccessInterceptorValueHolderInterface::class];
060   
061          if ($originalClass->isInterface()) {
062              $interfaces[] = $originalClass->getName();
063          } else {
064              $classGenerator->setExtendedClass($originalClass->getName());
065          }
066   
067          $classGenerator->setImplementedInterfaces($interfaces);
068          $classGenerator->addPropertyFromGenerator($valueHolder = new ValueHolderProperty());
069          $classGenerator->addPropertyFromGenerator($prefixInterceptors = new MethodPrefixInterceptors());
070          $classGenerator->addPropertyFromGenerator($suffixInterceptors = new MethodSuffixInterceptors());
071          $classGenerator->addPropertyFromGenerator($publicProperties);
072   
073          array_map(
074              function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
075                  ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
076              },
077              array_merge(
078                  array_map(
079                      $this->buildMethodInterceptor($prefixInterceptors, $suffixInterceptors, $valueHolder),
080                      ProxiedMethodsFilter::getProxiedMethods($originalClass)
081                  ),
082                  [
083                      Constructor::generateMethod($originalClass, $valueHolder),
084                      new StaticProxyConstructor($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors),
085                      new GetWrappedValueHolderValue($valueHolder),
086                      new SetMethodPrefixInterceptor($prefixInterceptors),
087                      new SetMethodSuffixInterceptor($suffixInterceptors),
088                      new MagicGet(
089                          $originalClass,
090                          $valueHolder,
091                          $prefixInterceptors,
092                          $suffixInterceptors,
093                          $publicProperties
094                      ),
095                      new MagicSet(
096                          $originalClass,
097                          $valueHolder,
098                          $prefixInterceptors,
099                          $suffixInterceptors,
100                          $publicProperties
101                      ),
102                      new MagicIsset(
103                          $originalClass,
104                          $valueHolder,
105                          $prefixInterceptors,
106                          $suffixInterceptors,
107                          $publicProperties
108                      ),
109                      new MagicUnset(
110                          $originalClass,
111                          $valueHolder,
112                          $prefixInterceptors,
113                          $suffixInterceptors,
114                          $publicProperties
115                      ),
116                      new MagicClone($originalClass, $valueHolder, $prefixInterceptors, $suffixInterceptors),
117                      new MagicSleep($originalClass, $valueHolder),
118                      new MagicWakeup($originalClass),
119                  ]
120              )
121          );
122      }
123   
124      private function buildMethodInterceptor(
125          MethodPrefixInterceptors $prefixes,
126          MethodSuffixInterceptors $suffixes,
127          ValueHolderProperty $valueHolder
128      ) : callable {
129          return function (ReflectionMethod $method) use ($prefixes, $suffixes, $valueHolder) : InterceptedMethod {
130              return InterceptedMethod::generateMethod(
131                  new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
132                  $valueHolder,
133                  $prefixes,
134                  $suffixes
135              );
136          };
137      }
138  }
139