✏️ 正在编辑: ContainerBuilder.php
路径:
/home/bpioifn/www/pigmentse/src/Adapter/ContainerBuilder.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php /** * 2007-2019 PrestaShop and Contributors * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@prestashop.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to https://www.prestashop.com for more information. * * @author PrestaShop SA <contact@prestashop.com> * @copyright 2007-2019 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ namespace PrestaShop\PrestaShop\Adapter; use Doctrine\Common\Cache\ArrayCache; use Doctrine\ORM\Tools\Setup; use LegacyCompilerPass; use PrestaShop\PrestaShop\Adapter\Container\ContainerBuilderExtensionInterface; use PrestaShop\PrestaShop\Adapter\Container\ContainerParametersExtension; use PrestaShop\PrestaShop\Adapter\Container\DoctrineBuilderExtension; use PrestaShop\PrestaShop\Core\EnvironmentInterface; use PrestaShopBundle\DependencyInjection\Compiler\LoadServicesFromModulesPass; use Symfony\Component\Config\ConfigCache; use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder as SfContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Dumper\PhpDumper; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; /** * Build the Container for PrestaShop Legacy. */ class ContainerBuilder { /** * @var ContainerInterface */ private static $containers; /** * @var string */ private $environment; /** * @var string */ private $containerName; /** * @var string */ private $containerClassName; /** * @var string */ private $dumpFile; /** * @var ConfigCache */ private $containerConfigCache; /** * @param string $containerName * @param bool $isDebug * * @return SfContainerBuilder * * @throws \Exception */ public static function getContainer($containerName, $isDebug) { if (!isset(self::$containers[$containerName])) { $builder = new ContainerBuilder(new Environment($isDebug)); self::$containers[$containerName] = $builder->buildContainer($containerName); } return self::$containers[$containerName]; } /** * @param EnvironmentInterface $environment */ public function __construct(EnvironmentInterface $environment) { $this->environment = $environment; } /** * @param string $containerName * * @return ContainerInterface|SfContainerBuilder * * @throws \Exception */ public function buildContainer($containerName) { $this->containerName = $containerName; $this->containerClassName = ucfirst($this->containerName) . 'Container'; $this->dumpFile = $this->environment->getCacheDir() . $this->containerClassName . '.php'; $this->containerConfigCache = new ConfigCache($this->dumpFile, $this->environment->isDebug()); //These methods load required files like autoload or annotation metadata so we need to load //them at each container creation, this can't be compiled. $this->loadDoctrineAnnotationMetadata(); $container = $this->loadDumpedContainer(); if (null === $container) { $container = $this->compileContainer(); } $this->loadModulesAutoloader($container); return $container; } /** * @return ContainerInterface|null */ private function loadDumpedContainer() { $container = null; if ($this->containerConfigCache->isFresh()) { require_once $this->dumpFile; $container = new $this->containerClassName(); } return $container; } /** * @return SfContainerBuilder * * @throws \Exception */ private function compileContainer() { $container = new SfContainerBuilder(); //If the container builder is modified the container logically should be rebuilt $container->addResource(new FileResource(__FILE__)); $container->addCompilerPass(new LoadServicesFromModulesPass($this->containerName), PassConfig::TYPE_BEFORE_OPTIMIZATION, 1); $container->addCompilerPass(new LegacyCompilerPass()); //Build extensions $builderExtensions = [ new ContainerParametersExtension($this->environment), new DoctrineBuilderExtension($this->environment->getCacheDir()), ]; /** @var ContainerBuilderExtensionInterface $builderExtension */ foreach ($builderExtensions as $builderExtension) { $builderExtension->build($container); } $this->loadServicesFromConfig($container); $container->compile(); //Dump the container file $dumper = new PhpDumper($container); $this->containerConfigCache->write( $dumper->dump(['class' => $this->containerClassName]), $container->getResources() ); return $container; } /** * In symfony context doctrine classes (like Table, Entity, ...) are available thanks to * the autoloader. In this specific context we don't have the general autoloader, so we need * to include these classes manually. This is performed in Doctrine\ORM\Configuration::newDefaultAnnotationDriver * which is called in Setup::createAnnotationMetadataConfiguration. */ private function loadDoctrineAnnotationMetadata() { //IMPORTANT: we need to provide a cache because doctrine tries to init a connection on redis, memcached, ... on its own Setup::createAnnotationMetadataConfiguration([], $this->environment->isDebug(), null, new ArrayCache()); } /** * @param SfContainerBuilder $container * * @throws \Exception */ private function loadServicesFromConfig(SfContainerBuilder $container) { $loader = new YamlFileLoader($container, new FileLocator(__DIR__)); $servicesPath = sprintf( '%sservices/%s/services_%s.yml', _PS_CONFIG_DIR_, $this->containerName, $this->environment->getName() ); $loader->load($servicesPath); } /** * Loops through all active modules and automatically include their autoload (if present). * Needs to be done as earlier as possible in application lifecycle. Unfortunately this can't * be done in a compiler pass because they are only executed on compilation and this needs to * be done at each container instanciation. * * @param ContainerInterface $container * * @throws \Exception */ private function loadModulesAutoloader(ContainerInterface $container) { if (!$container->hasParameter('kernel.active_modules')) { return; } $activeModules = $container->getParameter('kernel.active_modules'); foreach ($activeModules as $module) { $autoloader = _PS_MODULE_DIR_ . $module . '/vendor/autoload.php'; if (file_exists($autoloader)) { include_once $autoloader; } } } }
💾 保存文件
← 返回文件管理器