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\Generator\ClassGenerator;
|
||||||
use ProxyManager\GeneratorStrategy\BaseGeneratorStrategy;
|
use ProxyManager\GeneratorStrategy\BaseGeneratorStrategy;
|
||||||
|
use ProxyManager\Version;
|
||||||
use Symfony\Component\DependencyInjection\Container;
|
use Symfony\Component\DependencyInjection\Container;
|
||||||
use Symfony\Component\DependencyInjection\Definition;
|
use Symfony\Component\DependencyInjection\Definition;
|
||||||
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface;
|
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface;
|
||||||
@ -94,11 +95,35 @@ EOF;
|
|||||||
*/
|
*/
|
||||||
public function getProxyCode(Definition $definition)
|
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\);/',
|
'/(\$this->initializer[0-9a-f]++) && \1->__invoke\(\$this->(valueHolder[0-9a-f]++), (.*?), \1\);/',
|
||||||
'$1 && ($1->__invoke(\$$2, $3, $1) || 1) && $this->$2 = \$$2;',
|
'$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)
|
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 $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()
|
public function testGetProxyFactoryCode()
|
||||||
{
|
{
|
||||||
$definition = new Definition(__CLASS__);
|
$definition = new Definition(__CLASS__);
|
||||||
|
Reference in New Issue
Block a user