From 5ec2a252eea82211ca0de069e95ef0d86d253236 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 4 Jan 2021 12:30:20 +0100 Subject: [PATCH] [ProxyManager] fix tests --- composer.json | 2 +- .../LazyProxy/PhpDumper/ProxyDumper.php | 2 +- .../PhpDumper/Fixtures/proxy-implem.php | 108 ++++++++++++++---- src/Symfony/Bridge/ProxyManager/composer.json | 2 +- 4 files changed, 90 insertions(+), 24 deletions(-) diff --git a/composer.json b/composer.json index e614299e59..196918290d 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.1.3", "ext-xml": "*", - "friendsofphp/proxy-manager-lts": "^1.0", + "friendsofphp/proxy-manager-lts": "^1.0.2", "doctrine/event-manager": "~1.0", "doctrine/persistence": "^1.3|^2", "twig/twig": "^1.41|^2.10|^3.0", diff --git a/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php b/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php index 61edbd6306..599fa7c6ec 100644 --- a/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php +++ b/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php @@ -11,7 +11,7 @@ namespace Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper; -use ProxyManager\Generator\ClassGenerator; +use Laminas\Code\Generator\ClassGenerator; use ProxyManager\GeneratorStrategy\BaseGeneratorStrategy; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface; diff --git a/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/Fixtures/proxy-implem.php b/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/Fixtures/proxy-implem.php index 1dee20d7a3..19a9bdd512 100644 --- a/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/Fixtures/proxy-implem.php +++ b/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/Fixtures/proxy-implem.php @@ -48,7 +48,7 @@ class SunnyInterface_%s implements \ProxyManager\Proxy\VirtualProxyInterface, \S static $reflection; $reflection = $reflection ?? new \ReflectionClass(__CLASS__); - $instance%w= $reflection->newInstanceWithoutConstructor(); + $instance = $reflection->newInstanceWithoutConstructor(); $instance->initializer%s = $initializer; @@ -73,48 +73,114 @@ class SunnyInterface_%s implements \ProxyManager\Proxy\VirtualProxyInterface, \S return $this->valueHolder%s->$name; } - $targetObject = $this->valueHolder%s; + $realInstanceReflection = new \ReflectionClass(__CLASS__); - $backtrace = debug_backtrace(false%S); - trigger_error( - sprintf( - 'Undefined property: %s::$%s in %s on line %s', - __CLASS__, - $name, - $backtrace[0]['file'], - $backtrace[0]['line'] - ), - \E_USER_NOTICE - ); - return $targetObject->$name; + if (! $realInstanceReflection->hasProperty($name)) { + $targetObject = $this->valueHolder%s; + + $backtrace = debug_backtrace(false, 1); + trigger_error( + sprintf( + 'Undefined property: %%s::$%%s in %%s on line %%s', + $realInstanceReflection->getName(), + $name, + $backtrace[0]['file'], + $backtrace[0]['line'] + ), + \E_USER_NOTICE + ); + return $targetObject->$name; + } + + $targetObject = $this->valueHolder%s; + $accessor = function & () use ($targetObject, $name) { + return $targetObject->$name; + }; + $backtrace = debug_backtrace(true, 2); + $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \ProxyManager\Stub\EmptyClassStub(); + $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject)); + $returnValue = & $accessor(); + + return $returnValue; } public function __set($name, $value) { $this->initializer%s && ($this->initializer%s->__invoke($valueHolder%s, $this, '__set', array('name' => $name, 'value' => $value), $this->initializer%s) || 1) && $this->valueHolder%s = $valueHolder%s; - $targetObject = $this->valueHolder%s; + $realInstanceReflection = new \ReflectionClass(__CLASS__); - $targetObject->$name = $value;%wreturn $targetObject->$name; + if (! $realInstanceReflection->hasProperty($name)) { + $targetObject = $this->valueHolder%s; + + $targetObject->$name = $value; + + return $targetObject->$name; + } + + $targetObject = $this->valueHolder%s; + $accessor = function & () use ($targetObject, $name, $value) { + $targetObject->$name = $value; + + return $targetObject->$name; + }; + $backtrace = debug_backtrace(true, 2); + $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \ProxyManager\Stub\EmptyClassStub(); + $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject)); + $returnValue = & $accessor(); + + return $returnValue; } public function __isset($name) { $this->initializer%s && ($this->initializer%s->__invoke($valueHolder%s, $this, '__isset', array('name' => $name), $this->initializer%s) || 1) && $this->valueHolder%s = $valueHolder%s; - $targetObject = $this->valueHolder%s; + $realInstanceReflection = new \ReflectionClass(__CLASS__); - return isset($targetObject->$name); + if (! $realInstanceReflection->hasProperty($name)) { + $targetObject = $this->valueHolder%s; + + return isset($targetObject->$name); + } + + $targetObject = $this->valueHolder%s; + $accessor = function () use ($targetObject, $name) { + return isset($targetObject->$name); + }; + $backtrace = debug_backtrace(true, 2); + $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \ProxyManager\Stub\EmptyClassStub(); + $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject)); + $returnValue = $accessor(); + + return $returnValue; } public function __unset($name) { $this->initializer%s && ($this->initializer%s->__invoke($valueHolder%s, $this, '__unset', array('name' => $name), $this->initializer%s) || 1) && $this->valueHolder%s = $valueHolder%s; - $targetObject = $this->valueHolder%s; + $realInstanceReflection = new \ReflectionClass(__CLASS__); - unset($targetObject->$name); -%a } + if (! $realInstanceReflection->hasProperty($name)) { + $targetObject = $this->valueHolder%s; + + unset($targetObject->$name); + + return; + } + + $targetObject = $this->valueHolder%s; + $accessor = function () use ($targetObject, $name) { + unset($targetObject->$name); + + return; + }; + $backtrace = debug_backtrace(true, 2); + $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \ProxyManager\Stub\EmptyClassStub(); + $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject)); + $accessor(); + } public function __clone() { diff --git a/src/Symfony/Bridge/ProxyManager/composer.json b/src/Symfony/Bridge/ProxyManager/composer.json index ad39002258..7a63fddb14 100644 --- a/src/Symfony/Bridge/ProxyManager/composer.json +++ b/src/Symfony/Bridge/ProxyManager/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.1.3", "composer/package-versions-deprecated": "^1.8", - "friendsofphp/proxy-manager-lts": "^1.0", + "friendsofphp/proxy-manager-lts": "^1.0.2", "symfony/dependency-injection": "^4.0|^5.0" }, "require-dev": {