From 0f1605663a0b4104277f6d4f01fd692590426808 Mon Sep 17 00:00:00 2001 From: Lars Strojny Date: Wed, 14 Feb 2018 13:12:35 +0100 Subject: [PATCH] Retro-fit proxy code to make it deterministic for older proxy manager implementations --- .../LazyProxy/PhpDumper/ProxyDumper.php | 39 +++++++++++++++++-- .../LazyProxy/PhpDumper/ProxyDumperTest.php | 8 ++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php b/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php index 2b827324fa7b6..316cc8250173f 100644 --- a/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php +++ b/src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php @@ -13,6 +13,7 @@ use ProxyManager\Generator\ClassGenerator; use ProxyManager\GeneratorStrategy\BaseGeneratorStrategy; +use ProxyManager\Version; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface; @@ -94,11 +95,35 @@ public function getProxyFactoryCode(Definition $definition, $id, $factoryCode = */ public function getProxyCode(Definition $definition) { - return preg_replace( + $code = $this->classGenerator->generate($this->generateProxyClass($definition)); + + $code = preg_replace( '/(\$this->initializer[0-9a-f]++) && \1->__invoke\(\$this->(valueHolder[0-9a-f]++), (.*?), \1\);/', '$1 && ($1->__invoke(\$$2, $3, $1) || 1) && $this->$2 = \$$2;', - $this->classGenerator->generate($this->generateProxyClass($definition)) + $code ); + + if (version_compare(self::getProxyManagerVersion(), '2.2', '<')) { + $code = preg_replace( + '/((?:\$(?:this|initializer|instance)->)?(?:publicProperties|initializer|valueHolder))[0-9a-f]++/', + '${1}'.$this->getIdentifierSuffix($definition), + $code + ); + } + + return $code; + } + + /** + * @return string + */ + private static function getProxyManagerVersion() + { + if (!\class_exists(Version::class)) { + return '0.0.1'; + } + + return defined(Version::class.'::VERSION') ? Version::VERSION : Version::getVersion(); } /** @@ -108,7 +133,7 @@ public function getProxyCode(Definition $definition) */ private function getProxyClassName(Definition $definition) { - return preg_replace('/^.*\\\\/', '', $definition->getClass()).'_'.substr(hash('sha256', $definition->getClass().$this->salt), -7); + return preg_replace('/^.*\\\\/', '', $definition->getClass()).'_'.$this->getIdentifierSuffix($definition); } /** @@ -122,4 +147,12 @@ private function generateProxyClass(Definition $definition) return $generatedClass; } + + /** + * @return string + */ + private function getIdentifierSuffix(Definition $definition) + { + return substr(hash('sha256', $definition->getClass().$this->salt), -7); + } } diff --git a/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/ProxyDumperTest.php b/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/ProxyDumperTest.php index 640290e2b45a2..b4ce2106d8f2b 100644 --- a/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/ProxyDumperTest.php +++ b/src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/ProxyDumperTest.php @@ -61,6 +61,14 @@ public function testGetProxyCode() ); } + public function testDeterministicProxyCode() + { + $definition = new Definition(__CLASS__); + $definition->setLazy(true); + + $this->assertSame($this->dumper->getProxyCode($definition), $this->dumper->getProxyCode($definition)); + } + public function testGetProxyFactoryCode() { $definition = new Definition(__CLASS__);