vendor/shopware/core/System/Snippet/Files/SnippetFileLoader.php line 52
<?php declare(strict_types=1);namespace Shopware\Core\System\Snippet\Files;use Doctrine\DBAL\Connection;use Shopware\Core\Framework\App\ActiveAppsLoader;use Shopware\Core\Framework\Bundle;use Shopware\Core\Framework\Log\Package;use Shopware\Core\Framework\Plugin;use Symfony\Component\Finder\Finder;use Symfony\Component\HttpKernel\KernelInterface;#[Package('system-settings')]class SnippetFileLoader implements SnippetFileLoaderInterface{/*** @var array<string, string>*/private array $pluginAuthors = [];/*** @internal*/public function __construct(private readonly KernelInterface $kernel,private readonly Connection $connection,private readonly AppSnippetFileLoader $appSnippetFileLoader,private readonly ActiveAppsLoader $activeAppsLoader) {}public function loadSnippetFilesIntoCollection(SnippetFileCollection $snippetFileCollection): void{$this->loadPluginSnippets($snippetFileCollection);$this->loadAppSnippets($snippetFileCollection);}private function loadPluginSnippets(SnippetFileCollection $snippetFileCollection): void{foreach ($this->kernel->getBundles() as $bundle) {if (!$bundle instanceof Bundle) {continue;}$snippetDir = $bundle->getPath() . '/Resources/snippet';if (!is_dir($snippetDir)) {continue;}foreach ($this->loadSnippetFilesInDir($snippetDir, $bundle) as $snippetFile) {if ($snippetFileCollection->hasFileForPath($snippetFile->getPath())) {continue;}$snippetFileCollection->add($snippetFile);}}}private function loadAppSnippets(SnippetFileCollection $snippetFileCollection): void{foreach ($this->activeAppsLoader->getActiveApps() as $app) {$snippetFiles = $this->appSnippetFileLoader->loadSnippetFilesFromApp($app['author'] ?? '', $app['path']);foreach ($snippetFiles as $snippetFile) {$snippetFile->setTechnicalName($app['name']);$snippetFileCollection->add($snippetFile);}}}/*** @return AbstractSnippetFile[]*/private function loadSnippetFilesInDir(string $snippetDir, Bundle $bundle): array{$finder = new Finder();$finder->in($snippetDir)->files()->name('*.json');$snippetFiles = [];foreach ($finder->getIterator() as $fileInfo) {$nameParts = explode('.', $fileInfo->getFilenameWithoutExtension());$snippetFile = null;switch (\count($nameParts)) {case 2:$snippetFile = new GenericSnippetFile(implode('.', $nameParts),$fileInfo->getPathname(),$nameParts[1],$this->getAuthorFromBundle($bundle),false,$bundle->getName());break;case 3:$snippetFile = new GenericSnippetFile(implode('.', [$nameParts[0], $nameParts[1]]),$fileInfo->getPathname(),$nameParts[1],$this->getAuthorFromBundle($bundle),$nameParts[2] === 'base',$bundle->getName());break;}if ($snippetFile) {$snippetFiles[] = $snippetFile;}}return $snippetFiles;}private function getAuthorFromBundle(Bundle $bundle): string{if (!$bundle instanceof Plugin) {return 'Shopware';}return $this->getPluginAuthors()[$bundle::class] ?? '';}/*** @return array<string, string>*/private function getPluginAuthors(): array{if (!$this->pluginAuthors) {/** @var array<string, string> $authors */$authors = $this->connection->fetchAllKeyValue('SELECT `base_class` AS `baseClass`, `author`FROM `plugin`');$this->pluginAuthors = $authors;}return $this->pluginAuthors;}}