[FrameworkBundle] Fix class_exists() checks in PhpArrayAdapter-related cache warmers
This commit is contained in:
parent
1fcb66d129
commit
c60009eae8
@ -36,8 +36,8 @@ class AnnotationsCacheWarmer implements CacheWarmerInterface
|
||||
|
||||
/**
|
||||
* @param Reader $annotationReader
|
||||
* @param string $phpArrayFile The PHP file where annotations are cached.
|
||||
* @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered annotations are cached.
|
||||
* @param string $phpArrayFile the PHP file where annotations are cached
|
||||
* @param CacheItemPoolInterface $fallbackPool the pool where runtime-discovered annotations are cached
|
||||
*/
|
||||
public function __construct(Reader $annotationReader, $phpArrayFile, CacheItemPoolInterface $fallbackPool)
|
||||
{
|
||||
@ -67,9 +67,8 @@ class AnnotationsCacheWarmer implements CacheWarmerInterface
|
||||
|
||||
$arrayPool = new ArrayAdapter(0, false);
|
||||
$reader = new CachedReader($this->annotationReader, new DoctrineProvider($arrayPool));
|
||||
$throwingAutoloader = function ($class) { throw new \ReflectionException(sprintf('Class %s does not exist', $class)); };
|
||||
spl_autoload_register($throwingAutoloader);
|
||||
|
||||
spl_autoload_register(array($adapter, 'throwOnRequiredClass'));
|
||||
try {
|
||||
foreach ($annotatedClasses as $class) {
|
||||
try {
|
||||
@ -88,7 +87,7 @@ class AnnotationsCacheWarmer implements CacheWarmerInterface
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
spl_autoload_unregister($throwingAutoloader);
|
||||
spl_autoload_unregister(array($adapter, 'throwOnRequiredClass'));
|
||||
}
|
||||
|
||||
$values = $arrayPool->getValues();
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
|
||||
|
||||
use Doctrine\Common\Annotations\AnnotationException;
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use Symfony\Component\Cache\Adapter\AdapterInterface;
|
||||
use Symfony\Component\Cache\Adapter\ArrayAdapter;
|
||||
@ -36,9 +37,9 @@ class SerializerCacheWarmer implements CacheWarmerInterface
|
||||
private $fallbackPool;
|
||||
|
||||
/**
|
||||
* @param LoaderInterface[] $loaders The serializer metadata loaders.
|
||||
* @param string $phpArrayFile The PHP file where metadata are cached.
|
||||
* @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered metadata are cached.
|
||||
* @param LoaderInterface[] $loaders the serializer metadata loaders
|
||||
* @param string $phpArrayFile the PHP file where metadata are cached
|
||||
* @param CacheItemPoolInterface $fallbackPool the pool where runtime-discovered metadata are cached
|
||||
*/
|
||||
public function __construct(array $loaders, $phpArrayFile, CacheItemPoolInterface $fallbackPool)
|
||||
{
|
||||
@ -64,11 +65,22 @@ class SerializerCacheWarmer implements CacheWarmerInterface
|
||||
|
||||
$metadataFactory = new CacheClassMetadataFactory(new ClassMetadataFactory(new LoaderChain($this->loaders)), $arrayPool);
|
||||
|
||||
spl_autoload_register(array($adapter, 'throwOnRequiredClass'));
|
||||
try {
|
||||
foreach ($this->extractSupportedLoaders($this->loaders) as $loader) {
|
||||
foreach ($loader->getMappedClasses() as $mappedClass) {
|
||||
try {
|
||||
$metadataFactory->getMetadataFor($mappedClass);
|
||||
} catch (\ReflectionException $e) {
|
||||
// ignore failing reflection
|
||||
} catch (AnnotationException $e) {
|
||||
// ignore failing annotations
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
spl_autoload_unregister(array($adapter, 'throwOnRequiredClass'));
|
||||
}
|
||||
|
||||
$values = $arrayPool->getValues();
|
||||
$adapter->warmUp($values);
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
|
||||
|
||||
use Doctrine\Common\Annotations\AnnotationException;
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use Symfony\Component\Cache\Adapter\AdapterInterface;
|
||||
use Symfony\Component\Cache\Adapter\ArrayAdapter;
|
||||
@ -38,8 +39,8 @@ class ValidatorCacheWarmer implements CacheWarmerInterface
|
||||
|
||||
/**
|
||||
* @param ValidatorBuilderInterface $validatorBuilder
|
||||
* @param string $phpArrayFile The PHP file where metadata are cached.
|
||||
* @param CacheItemPoolInterface $fallbackPool The pool where runtime-discovered metadata are cached.
|
||||
* @param string $phpArrayFile the PHP file where metadata are cached
|
||||
* @param CacheItemPoolInterface $fallbackPool the pool where runtime-discovered metadata are cached
|
||||
*/
|
||||
public function __construct(ValidatorBuilderInterface $validatorBuilder, $phpArrayFile, CacheItemPoolInterface $fallbackPool)
|
||||
{
|
||||
@ -66,9 +67,7 @@ class ValidatorCacheWarmer implements CacheWarmerInterface
|
||||
$loaders = $this->validatorBuilder->getLoaders();
|
||||
$metadataFactory = new LazyLoadingMetadataFactory(new LoaderChain($loaders), new Psr6Cache($arrayPool));
|
||||
|
||||
$throwingAutoloader = function ($class) { throw new \ReflectionException(sprintf('Class %s does not exist', $class)); };
|
||||
spl_autoload_register($throwingAutoloader);
|
||||
|
||||
spl_autoload_register(array($adapter, 'throwOnRequiredClass'));
|
||||
try {
|
||||
foreach ($this->extractSupportedLoaders($loaders) as $loader) {
|
||||
foreach ($loader->getMappedClasses() as $mappedClass) {
|
||||
@ -78,15 +77,17 @@ class ValidatorCacheWarmer implements CacheWarmerInterface
|
||||
}
|
||||
} catch (\ReflectionException $e) {
|
||||
// ignore failing reflection
|
||||
} catch (AnnotationException $e) {
|
||||
// ignore failing annotations
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
spl_autoload_unregister($throwingAutoloader);
|
||||
spl_autoload_unregister(array($adapter, 'throwOnRequiredClass'));
|
||||
}
|
||||
|
||||
$values = $arrayPool->getValues();
|
||||
$adapter->warmUp($values);
|
||||
$adapter->warmUp(array_filter($values));
|
||||
|
||||
foreach ($values as $k => $v) {
|
||||
$item = $this->fallbackPool->getItem($k);
|
||||
|
@ -17,7 +17,7 @@
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.5.9",
|
||||
"symfony/cache": "~3.2",
|
||||
"symfony/cache": "~3.2.2|~3.3",
|
||||
"symfony/class-loader": "~3.2",
|
||||
"symfony/dependency-injection": "~3.2.1|~3.3",
|
||||
"symfony/config": "~2.8|~3.0",
|
||||
|
@ -365,4 +365,42 @@ EOF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \ReflectionException When $class is not found and is required
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
public static function throwOnRequiredClass($class)
|
||||
{
|
||||
$e = new \ReflectionException(sprintf('Class %s does not exist', $class));
|
||||
$trace = $e->getTrace();
|
||||
$autoloadFrame = array(
|
||||
'function' => 'spl_autoload_call',
|
||||
'args' => array($class),
|
||||
);
|
||||
$i = array_search($autoloadFrame, $trace);
|
||||
|
||||
if (false !== $i++ && isset($trace[$i]['function']) && !isset($trace[$i]['class'])) {
|
||||
switch ($trace[$i]['function']) {
|
||||
case 'get_class_methods':
|
||||
case 'get_class_vars':
|
||||
case 'get_parent_class':
|
||||
case 'is_a':
|
||||
case 'is_subclass_of':
|
||||
case 'class_exists':
|
||||
case 'class_implements':
|
||||
case 'class_parents':
|
||||
case 'trait_exists':
|
||||
case 'defined':
|
||||
case 'interface_exists':
|
||||
case 'method_exists':
|
||||
case 'property_exists':
|
||||
case 'is_callable':
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user