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

AccessInterceptorScopeLocalizerGenerator.php

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


01  <?php
02   
03  declare(strict_types=1);
04   
05  namespace ProxyManager\ProxyGenerator;
06   
07  use ProxyManager\Exception\InvalidProxiedClassException;
08  use ProxyManager\Generator\Util\ClassGeneratorUtils;
09  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  }
99