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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
AccessInterceptorValueHolderGenerator.php
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