vendor/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php line 52

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Bundle\FrameworkBundle\CacheWarmer;
  11. use Doctrine\Common\Annotations\AnnotationException;
  12. use Symfony\Component\Cache\Adapter\ArrayAdapter;
  13. use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
  14. use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory;
  15. use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
  16. use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
  17. use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
  18. use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
  19. use Symfony\Component\Validator\ValidatorBuilder;
  20. /**
  21.  * Warms up XML and YAML validator metadata.
  22.  *
  23.  * @author Titouan Galopin <galopintitouan@gmail.com>
  24.  */
  25. class ValidatorCacheWarmer extends AbstractPhpFileCacheWarmer
  26. {
  27.     private ValidatorBuilder $validatorBuilder;
  28.     /**
  29.      * @param string $phpArrayFile The PHP file where metadata are cached
  30.      */
  31.     public function __construct(ValidatorBuilder $validatorBuilderstring $phpArrayFile)
  32.     {
  33.         parent::__construct($phpArrayFile);
  34.         $this->validatorBuilder $validatorBuilder;
  35.     }
  36.     /**
  37.      * {@inheritdoc}
  38.      */
  39.     protected function doWarmUp(string $cacheDirArrayAdapter $arrayAdapter): bool
  40.     {
  41.         if (!method_exists($this->validatorBuilder'getLoaders')) {
  42.             return false;
  43.         }
  44.         $loaders $this->validatorBuilder->getLoaders();
  45.         $metadataFactory = new LazyLoadingMetadataFactory(new LoaderChain($loaders), $arrayAdapter);
  46.         foreach ($this->extractSupportedLoaders($loaders) as $loader) {
  47.             foreach ($loader->getMappedClasses() as $mappedClass) {
  48.                 try {
  49.                     if ($metadataFactory->hasMetadataFor($mappedClass)) {
  50.                         $metadataFactory->getMetadataFor($mappedClass);
  51.                     }
  52.                 } catch (AnnotationException) {
  53.                     // ignore failing annotations
  54.                 } catch (\Exception $e) {
  55.                     $this->ignoreAutoloadException($mappedClass$e);
  56.                 }
  57.             }
  58.         }
  59.         return true;
  60.     }
  61.     /**
  62.      * @return string[] A list of classes to preload on PHP 7.4+
  63.      */
  64.     protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values): array
  65.     {
  66.         // make sure we don't cache null values
  67.         $values array_filter($values, function ($val) { return null !== $val; });
  68.         return parent::warmUpPhpArrayAdapter($phpArrayAdapter$values);
  69.     }
  70.     /**
  71.      * @param LoaderInterface[] $loaders
  72.      *
  73.      * @return XmlFileLoader[]|YamlFileLoader[]
  74.      */
  75.     private function extractSupportedLoaders(array $loaders): array
  76.     {
  77.         $supportedLoaders = [];
  78.         foreach ($loaders as $loader) {
  79.             if ($loader instanceof XmlFileLoader || $loader instanceof YamlFileLoader) {
  80.                 $supportedLoaders[] = $loader;
  81.             } elseif ($loader instanceof LoaderChain) {
  82.                 $supportedLoaders array_merge($supportedLoaders$this->extractSupportedLoaders($loader->getLoaders()));
  83.             }
  84.         }
  85.         return $supportedLoaders;
  86.     }
  87. }