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__); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy