[ Index ] |
PHP Cross Reference of phpBB-3.3.14-deutsch |
[Summary view] [Print] [Text view]
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\VirtualProxyInterface; 10 use ProxyManager\ProxyGenerator\AccessInterceptor\MethodGenerator\MagicWakeup; 11 use ProxyManager\ProxyGenerator\Assertion\CanProxyAssertion; 12 use ProxyManager\ProxyGenerator\LazyLoading\MethodGenerator\StaticProxyConstructor; 13 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\GetProxyInitializer; 14 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\InitializeProxy; 15 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\IsProxyInitialized; 16 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\LazyLoadingMethodInterceptor; 17 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicClone; 18 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicGet; 19 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicIsset; 20 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSet; 21 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicSleep; 22 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\MagicUnset; 23 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\MethodGenerator\SetProxyInitializer; 24 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty; 25 use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty; 26 use ProxyManager\ProxyGenerator\PropertyGenerator\PublicPropertiesMap; 27 use ProxyManager\ProxyGenerator\Util\Properties; 28 use ProxyManager\ProxyGenerator\Util\ProxiedMethodsFilter; 29 use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\Constructor; 30 use ProxyManager\ProxyGenerator\ValueHolder\MethodGenerator\GetWrappedValueHolderValue; 31 use ReflectionClass; 32 use ReflectionMethod; 33 use Zend\Code\Generator\ClassGenerator; 34 use Zend\Code\Generator\MethodGenerator; 35 use Zend\Code\Reflection\MethodReflection; 36 37 /** 38 * Generator for proxies implementing {@see \ProxyManager\Proxy\VirtualProxyInterface} 39 * 40 * {@inheritDoc} 41 * 42 * @author Marco Pivetta <ocramius@gmail.com> 43 * @license MIT 44 */ 45 class LazyLoadingValueHolderGenerator implements ProxyGeneratorInterface 46 { 47 /** 48 * {@inheritDoc} 49 * 50 * @throws InvalidProxiedClassException 51 * @throws \Zend\Code\Generator\Exception\InvalidArgumentException 52 * @throws \InvalidArgumentException 53 */ 54 public function generate(ReflectionClass $originalClass, ClassGenerator $classGenerator) 55 { 56 CanProxyAssertion::assertClassCanBeProxied($originalClass); 57 58 $interfaces = [VirtualProxyInterface::class]; 59 $publicProperties = new PublicPropertiesMap(Properties::fromReflectionClass($originalClass)); 60 61 if ($originalClass->isInterface()) { 62 $interfaces[] = $originalClass->getName(); 63 } else { 64 $classGenerator->setExtendedClass($originalClass->getName()); 65 } 66 67 $classGenerator->setImplementedInterfaces($interfaces); 68 $classGenerator->addPropertyFromGenerator($valueHolder = new ValueHolderProperty()); 69 $classGenerator->addPropertyFromGenerator($initializer = new InitializerProperty()); 70 $classGenerator->addPropertyFromGenerator($publicProperties); 71 72 array_map( 73 function (MethodGenerator $generatedMethod) use ($originalClass, $classGenerator) { 74 ClassGeneratorUtils::addMethodIfNotFinal($originalClass, $classGenerator, $generatedMethod); 75 }, 76 array_merge( 77 array_map( 78 $this->buildLazyLoadingMethodInterceptor($initializer, $valueHolder), 79 ProxiedMethodsFilter::getProxiedMethods($originalClass) 80 ), 81 [ 82 new StaticProxyConstructor($initializer, Properties::fromReflectionClass($originalClass)), 83 Constructor::generateMethod($originalClass, $valueHolder), 84 new MagicGet($originalClass, $initializer, $valueHolder, $publicProperties), 85 new MagicSet($originalClass, $initializer, $valueHolder, $publicProperties), 86 new MagicIsset($originalClass, $initializer, $valueHolder, $publicProperties), 87 new MagicUnset($originalClass, $initializer, $valueHolder, $publicProperties), 88 new MagicClone($originalClass, $initializer, $valueHolder), 89 new MagicSleep($originalClass, $initializer, $valueHolder), 90 new MagicWakeup($originalClass), 91 new SetProxyInitializer($initializer), 92 new GetProxyInitializer($initializer), 93 new InitializeProxy($initializer, $valueHolder), 94 new IsProxyInitialized($valueHolder), 95 new GetWrappedValueHolderValue($valueHolder), 96 ] 97 ) 98 ); 99 } 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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Mon Nov 25 19:05:08 2024 | Cross-referenced by PHPXref 0.7.1 |