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

  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.     protected function doWarmUp(string $cacheDirArrayAdapter $arrayAdapter): bool
  37.     {
  38.         if (!method_exists($this->validatorBuilder'getLoaders')) {
  39.             return false;
  40.         }
  41.         $loaders $this->validatorBuilder->getLoaders();
  42.         $metadataFactory = new LazyLoadingMetadataFactory(new LoaderChain($loaders), $arrayAdapter);
  43.         foreach ($this->extractSupportedLoaders($loaders) as $loader) {
  44.             foreach ($loader->getMappedClasses() as $mappedClass) {
  45.                 try {
  46.                     if ($metadataFactory->hasMetadataFor($mappedClass)) {
  47.                         $metadataFactory->getMetadataFor($mappedClass);
  48.                     }
  49.                 } catch (AnnotationException) {
  50.                     // ignore failing annotations
  51.                 } catch (\Exception $e) {
  52.                     $this->ignoreAutoloadException($mappedClass$e);
  53.                 }
  54.             }
  55.         }
  56.         return true;
  57.     }
  58.     /**
  59.      * @return string[] A list of classes to preload on PHP 7.4+
  60.      */
  61.     protected function warmUpPhpArrayAdapter(PhpArrayAdapter $phpArrayAdapter, array $values): array
  62.     {
  63.         // make sure we don't cache null values
  64.         $values array_filter($values, function ($val) { return null !== $val; });
  65.         return parent::warmUpPhpArrayAdapter($phpArrayAdapter$values);
  66.     }
  67.     /**
  68.      * @param LoaderInterface[] $loaders
  69.      *
  70.      * @return XmlFileLoader[]|YamlFileLoader[]
  71.      */
  72.     private function extractSupportedLoaders(array $loaders): array
  73.     {
  74.         $supportedLoaders = [];
  75.         foreach ($loaders as $loader) {
  76.             if ($loader instanceof XmlFileLoader || $loader instanceof YamlFileLoader) {
  77.                 $supportedLoaders[] = $loader;
  78.             } elseif ($loader instanceof LoaderChain) {
  79.                 $supportedLoaders array_merge($supportedLoaders$this->extractSupportedLoaders($loader->getLoaders()));
  80.             }
  81.         }
  82.         return $supportedLoaders;
  83.     }
  84. }