vendor/shopware/core/HttpKernel.php line 129

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core;
  3. use Composer\Autoload\ClassLoader;
  4. use Doctrine\DBAL\Configuration;
  5. use Doctrine\DBAL\Connection;
  6. use Doctrine\DBAL\ConnectionException;
  7. use Doctrine\DBAL\DriverManager;
  8. use PackageVersions\Versions;
  9. use Shopware\Core\Framework\Adapter\Cache\CacheIdLoader;
  10. use Shopware\Core\Framework\Event\BeforeSendResponseEvent;
  11. use Shopware\Core\Framework\Plugin\KernelPluginLoader\DbalKernelPluginLoader;
  12. use Shopware\Core\Framework\Plugin\KernelPluginLoader\KernelPluginLoader;
  13. use Shopware\Core\Framework\Routing\RequestTransformerInterface;
  14. use Shopware\Core\Profiling\Doctrine\DebugStack;
  15. use Shopware\Storefront\Framework\Cache\CacheStore;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\HttpCache\HttpCache;
  19. use Symfony\Component\HttpKernel\HttpKernelInterface;
  20. use Symfony\Component\HttpKernel\KernelInterface;
  21. use Symfony\Component\HttpKernel\TerminableInterface;
  22. class HttpKernel
  23. {
  24.     /**
  25.      * @var Connection|null
  26.      */
  27.     protected static $connection;
  28.     /**
  29.      * @var string
  30.      */
  31.     protected static $kernelClass Kernel::class;
  32.     /**
  33.      * @var ClassLoader|null
  34.      */
  35.     protected $classLoader;
  36.     /**
  37.      * @var string
  38.      */
  39.     protected $environment;
  40.     /**
  41.      * @var bool
  42.      */
  43.     protected $debug;
  44.     /**
  45.      * @var string
  46.      */
  47.     protected $projectDir;
  48.     /**
  49.      * @var KernelPluginLoader|null
  50.      */
  51.     protected $pluginLoader;
  52.     /**
  53.      * @var KernelInterface|null
  54.      */
  55.     protected $kernel;
  56.     public function __construct(string $environmentbool $debug, ?ClassLoader $classLoader null)
  57.     {
  58.         $this->classLoader $classLoader;
  59.         $this->environment $environment;
  60.         $this->debug $debug;
  61.     }
  62.     public function handle(Request $request$type HttpKernelInterface::MASTER_REQUEST$catch true): HttpKernelResult
  63.     {
  64.         try {
  65.             return $this->doHandle($request, (int) $type, (bool) $catch);
  66.         } catch (ConnectionException $e) {
  67.             $connection self::getConnection();
  68.             $message str_replace([$connection->getParams()['password'], $connection->getParams()['user']], '******'$e->getMessage());
  69.             throw new \RuntimeException(sprintf('Could not connect to database. Message from SQL Server: %s'$message));
  70.         }
  71.     }
  72.     public function getKernel(): KernelInterface
  73.     {
  74.         return $this->createKernel();
  75.     }
  76.     /**
  77.      * Allows to switch the plugin loading.
  78.      */
  79.     public function setPluginLoader(KernelPluginLoader $pluginLoader): void
  80.     {
  81.         $this->pluginLoader $pluginLoader;
  82.     }
  83.     public static function getConnection(): Connection
  84.     {
  85.         if (self::$connection) {
  86.             return self::$connection;
  87.         }
  88.         $url $_ENV['DATABASE_URL']
  89.             ?? $_SERVER['DATABASE_URL']
  90.             ?? getenv('DATABASE_URL');
  91.         $parameters = [
  92.             'url' => $url,
  93.             'charset' => 'utf8mb4',
  94.         ];
  95.         self::$connection DriverManager::getConnection($parameters, new Configuration());
  96.         return self::$connection;
  97.     }
  98.     public function terminate(Request $requestResponse $response): void
  99.     {
  100.         if (!$this->kernel instanceof TerminableInterface) {
  101.             return;
  102.         }
  103.         $this->kernel->terminate($request$response);
  104.     }
  105.     private function doHandle(Request $requestint $typebool $catch): HttpKernelResult
  106.     {
  107.         // create core kernel which contains bootstrapping for plugins etc.
  108.         $kernel $this->createKernel();
  109.         $kernel->boot();
  110.         $container $kernel->getContainer();
  111.         // transform request to resolve seo urls and detect sales channel
  112.         $transformed $container
  113.             ->get(RequestTransformerInterface::class)
  114.             ->transform($request);
  115.         // check for http caching
  116.         $enabled $container->getParameter('shopware.http.cache.enabled');
  117.         if ($enabled) {
  118.             $kernel = new HttpCache($kernel$container->get(CacheStore::class), null, ['debug' => $this->debug]);
  119.         }
  120.         $response $kernel->handle($transformed$type$catch);
  121.         // fire event to trigger runtime events like seo url headers
  122.         $event = new BeforeSendResponseEvent($transformed$response);
  123.         $container->get('event_dispatcher')->dispatch($event);
  124.         return new HttpKernelResult($transformed$event->getResponse());
  125.     }
  126.     private function createKernel(): KernelInterface
  127.     {
  128.         if ($this->kernel !== null) {
  129.             return $this->kernel;
  130.         }
  131.         $versions Versions::VERSIONS;
  132.         if (isset($versions['shopware/core'])) {
  133.             $shopwareVersion Versions::getVersion('shopware/core');
  134.         } else {
  135.             $shopwareVersion Versions::getVersion('shopware/platform');
  136.         }
  137.         $connection self::getConnection();
  138.         if ($this->environment === 'dev') {
  139.             $connection->getConfiguration()->setSQLLogger(new DebugStack());
  140.         }
  141.         $pluginLoader $this->createPluginLoader($connection);
  142.         $cacheId = (new CacheIdLoader($connection))->load();
  143.         return $this->kernel = new static::$kernelClass(
  144.             $this->environment,
  145.             $this->debug,
  146.             $pluginLoader,
  147.             $cacheId,
  148.             $shopwareVersion,
  149.             $connection,
  150.             $this->getProjectDir()
  151.         );
  152.     }
  153.     private function getProjectDir()
  154.     {
  155.         if ($this->projectDir === null) {
  156.             $r = new \ReflectionObject($this);
  157.             if (!file_exists($dir $r->getFileName())) {
  158.                 throw new \LogicException(sprintf('Cannot auto-detect project dir for kernel of class "%s".'$r->name));
  159.             }
  160.             $dir $rootDir = \dirname($dir);
  161.             while (!file_exists($dir '/composer.json')) {
  162.                 if ($dir === \dirname($dir)) {
  163.                     return $this->projectDir $rootDir;
  164.                 }
  165.                 $dir = \dirname($dir);
  166.             }
  167.             $this->projectDir $dir;
  168.         }
  169.         return $this->projectDir;
  170.     }
  171.     private function createPluginLoader(Connection $connection): KernelPluginLoader
  172.     {
  173.         if ($this->pluginLoader) {
  174.             return $this->pluginLoader;
  175.         }
  176.         if (!$this->classLoader) {
  177.             throw new \RuntimeException('No plugin loader and no class loader provided');
  178.         }
  179.         $this->pluginLoader = new DbalKernelPluginLoader($this->classLoadernull$connection);
  180.         return $this->pluginLoader;
  181.     }
  182. }