Skip to content

Commit 0f16056

Browse files
committed
Retro-fit proxy code to make it deterministic for older proxy manager implementations
1 parent 05a0452 commit 0f16056

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/Symfony/Bridge/ProxyManager/LazyProxy/PhpDumper/ProxyDumper.php

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use ProxyManager\Generator\ClassGenerator;
1515
use ProxyManager\GeneratorStrategy\BaseGeneratorStrategy;
16+
use ProxyManager\Version;
1617
use Symfony\Component\DependencyInjection\Container;
1718
use Symfony\Component\DependencyInjection\Definition;
1819
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface;
@@ -94,11 +95,35 @@ public function getProxyFactoryCode(Definition $definition, $id, $factoryCode =
9495
*/
9596
public function getProxyCode(Definition $definition)
9697
{
97-
return preg_replace(
98+
$code = $this->classGenerator->generate($this->generateProxyClass($definition));
99+
100+
$code = preg_replace(
98101
'/(\$this->initializer[0-9a-f]++) && \1->__invoke\(\$this->(valueHolder[0-9a-f]++), (.*?), \1\);/',
99102
'$1 && ($1->__invoke(\$$2, $3, $1) || 1) && $this->$2 = \$$2;',
100-
$this->classGenerator->generate($this->generateProxyClass($definition))
103+
$code
101104
);
105+
106+
if (version_compare(self::getProxyManagerVersion(), '2.2', '<')) {
107+
$code = preg_replace(
108+
'/((?:\$(?:this|initializer|instance)->)?(?:publicProperties|initializer|valueHolder))[0-9a-f]++/',
109+
'${1}'.$this->getIdentifierSuffix($definition),
110+
$code
111+
);
112+
}
113+
114+
return $code;
115+
}
116+
117+
/**
118+
* @return string
119+
*/
120+
private static function getProxyManagerVersion()
121+
{
122+
if (!\class_exists(Version::class)) {
123+
return '0.0.1';
124+
}
125+
126+
return defined(Version::class.'::VERSION') ? Version::VERSION : Version::getVersion();
102127
}
103128

104129
/**
@@ -108,7 +133,7 @@ public function getProxyCode(Definition $definition)
108133
*/
109134
private function getProxyClassName(Definition $definition)
110135
{
111-
return preg_replace('/^.*\\\\/', '', $definition->getClass()).'_'.substr(hash('sha256', $definition->getClass().$this->salt), -7);
136+
return preg_replace('/^.*\\\\/', '', $definition->getClass()).'_'.$this->getIdentifierSuffix($definition);
112137
}
113138

114139
/**
@@ -122,4 +147,12 @@ private function generateProxyClass(Definition $definition)
122147

123148
return $generatedClass;
124149
}
150+
151+
/**
152+
* @return string
153+
*/
154+
private function getIdentifierSuffix(Definition $definition)
155+
{
156+
return substr(hash('sha256', $definition->getClass().$this->salt), -7);
157+
}
125158
}

src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/PhpDumper/ProxyDumperTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ public function testGetProxyCode()
6161
);
6262
}
6363

64+
public function testDeterministicProxyCode()
65+
{
66+
$definition = new Definition(__CLASS__);
67+
$definition->setLazy(true);
68+
69+
$this->assertSame($this->dumper->getProxyCode($definition), $this->dumper->getProxyCode($definition));
70+
}
71+
6472
public function testGetProxyFactoryCode()
6573
{
6674
$definition = new Definition(__CLASS__);

0 commit comments

Comments
 (0)