Retro-fit proxy code to make it deterministic for older proxy manager implementations

This commit is contained in:
Lars Strojny 2018-02-14 13:12:35 +01:00
parent 05a045268f
commit 0f1605663a
2 changed files with 44 additions and 3 deletions

View File

@ -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);
}
}

View File

@ -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__);