vendor/pimcore/pimcore/lib/HttpKernel/BundleCollection/LazyLoadedItem.php line 55

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\HttpKernel\BundleCollection;
  16. use Pimcore\Extension\Bundle\PimcoreBundleInterface;
  17. use Pimcore\HttpKernel\Bundle\DependentBundleInterface;
  18. use Symfony\Component\HttpKernel\Bundle\BundleInterface;
  19. class LazyLoadedItem extends AbstractItem
  20. {
  21.     /**
  22.      * @var string
  23.      */
  24.     private $className;
  25.     /**
  26.      * @var BundleInterface
  27.      */
  28.     private $bundle;
  29.     /**
  30.      * @var array
  31.      */
  32.     private static $classImplementsCache = [];
  33.     /**
  34.      * LazyLoadedItem constructor.
  35.      *
  36.      * @param string $className
  37.      * @param int $priority
  38.      * @param array $environments
  39.      * @param string $source
  40.      */
  41.     public function __construct(
  42.         string $className,
  43.         int $priority 0,
  44.         array $environments = [],
  45.         string $source self::SOURCE_PROGRAMATICALLY
  46.     ) {
  47.         if (!class_exists($className)) {
  48.             throw new \InvalidArgumentException(sprintf('The class "%s" does not exist'$className));
  49.         }
  50.         $this->className $className;
  51.         parent::__construct($priority$environments$source);
  52.     }
  53.     /**
  54.      * @return string
  55.      */
  56.     public function getBundleIdentifier(): string
  57.     {
  58.         return $this->className;
  59.     }
  60.     /**
  61.      * @return BundleInterface
  62.      */
  63.     public function getBundle(): BundleInterface
  64.     {
  65.         if (null === $this->bundle) {
  66.             $className $this->className;
  67.             $this->bundle = new $className;
  68.         }
  69.         return $this->bundle;
  70.     }
  71.     /**
  72.      * @return bool
  73.      */
  74.     public function isPimcoreBundle(): bool
  75.     {
  76.         if (null !== $this->bundle) {
  77.             return $this->bundle instanceof PimcoreBundleInterface;
  78.         }
  79.         // do not initialize bundle - check class instead
  80.         return self::implementsInterface($this->classNamePimcoreBundleInterface::class);
  81.     }
  82.     /**
  83.      * @param BundleCollection $collection
  84.      */
  85.     public function registerDependencies(BundleCollection $collection)
  86.     {
  87.         if (self::implementsInterface($this->classNameDependentBundleInterface::class)) {
  88.             /** @var DependentBundleInterface $className */
  89.             $className $this->className;
  90.             $className::registerDependentBundles($collection);
  91.         }
  92.     }
  93.     /**
  94.      * @param string $className
  95.      * @param string $interfaceName
  96.      *
  97.      * @return bool
  98.      */
  99.     private static function implementsInterface(string $classNamestring $interfaceName): bool
  100.     {
  101.         if (!isset(self::$classImplementsCache[$className])) {
  102.             self::$classImplementsCache[$className] = class_implements($className);
  103.         }
  104.         return in_array($interfaceNameself::$classImplementsCache[$className]);
  105.     }
  106. }