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 |
LazyLoadingValueHolderGenerator.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\VirtualProxyInterface;
010 use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup;
011 use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion;
012 use ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\StaticProxyConstructor;
013 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\GetProxyInitializer;
014 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\InitializeProxy;
015 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\IsProxyInitialized;
016 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor;
017 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicClone;
018 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicGet;
019 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicIsset;
020 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSet;
021 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSleep;
022 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicUnset;
023 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\SetProxyInitializer;
024 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty;
025 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty;
026 use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap;
027 use ProxyManager\ProxyGenerator\Util\Properties;
028 use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter;
029 use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\Constructor;
030 use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue;
031 use ReflectionClass;
032 use ReflectionMethod;
033 use Zend\Code\Generator\ClassGenerator;
034 use Zend\Code\Generator\MethodGenerator;
035 use Zend\Code\Reflection\MethodReflection;
036
037 /**
038 * Generator for proxies implementing {@see \ProxyManager\Proxy\VirtualProxyInterface}
039 *
040 * {@inheritDoc}
041 *
042 * @author Marco Pivetta <ocramius@gmail.com>
043 * @license MIT
044 */
045 class LazyLoadingValueHolderGenerator implements ProxyGeneratorInterface
046 {
047 /**
048 * {@inheritDoc}
049 *
050 * @throws InvalidProxiedClassException
051 * @throws \Zend\Code\Generator\Exception\InvalidArgumentException
052 * @throws \InvalidArgumentException
053 */
054 public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator)
055 {
056 CanProxyAssertion::assertClassCanBeProxied($originalClass);
057
058 $interfaces = [VirtualProxyInterface::class];
059 $publicProperties = new PublicPropertiesMap(Properties::fromReflectionClass($originalClass));
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($initializer = new InitializerProperty());
070 $classGenerator->addPropertyFromGenerator($publicProperties);
071
072 array_map(
073 function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) {
074 ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod);
075 },
076 array_merge(
077 array_map(
078 $this->buildLazyLoadingMethodInterceptor($initializer, $valueHolder),
079 ProxiedMethodsFilter::getProxiedMethods($originalClass)
080 ),
081 [
082 new StaticProxyConstructor($initializer, Properties::fromReflectionClass($originalClass)),
083 Constructor::generateMethod($originalClass, $valueHolder),
084 new MagicGet($originalClass, $initializer, $valueHolder, $publicProperties),
085 new MagicSet($originalClass, $initializer, $valueHolder, $publicProperties),
086 new MagicIsset($originalClass, $initializer, $valueHolder, $publicProperties),
087 new MagicUnset($originalClass, $initializer, $valueHolder, $publicProperties),
088 new MagicClone($originalClass, $initializer, $valueHolder),
089 new MagicSleep($originalClass, $initializer, $valueHolder),
090 new MagicWakeup($originalClass),
091 new SetProxyInitializer($initializer),
092 new GetProxyInitializer($initializer),
093 new InitializeProxy($initializer, $valueHolder),
094 new IsProxyInitialized($valueHolder),
095 new GetWrappedValueHolderValue($valueHolder),
096 ]
097 )
098 );
099 }
100
101 private function buildLazyLoadingMethodInterceptor(
102 InitializerProperty $initializer,
103 ValueHolderProperty $valueHolder
104 ) : callable {
105 return function (ReflectionMethod $method) use ($initializer, $valueHolder) : LazyLoadingMethodInterceptor {
106 return LazyLoadingMethodInterceptor::generateMethod(
107 new MethodReflection($method->getDeclaringClass()->getName(), $method->getName()),
108 $initializer,
109 $valueHolder
110 );
111 };
112 }
113 }
114