Retro-fit proxy code to make it deterministic for older proxy manager implementations
This commit is contained in:
parent
05a045268f
commit
0f1605663a
@ -13,6 +13,7 @@ namespace Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper;
|
||||
|
||||
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 @@ EOF;
|
||||
*/
|
||||
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 @@ EOF;
|
||||
*/
|
||||
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 @@ EOF;
|
||||
|
||||
return $generatedClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private function getIdentifierSuffix(Definition $definition)
|
||||
{
|
||||
return substr(hash('sha256', $definition->getClass().$this->salt), -7);
|
||||
}
|
||||
}
|
||||
|
@ -61,6 +61,14 @@ class ProxyDumperTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
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__);
|
||||
|
Reference in New Issue
Block a user