Spaces:
No application file
No application file
namespace Mautic\CoreBundle\DependencyInjection\Builder; | |
use Mautic\CoreBundle\DependencyInjection\Builder\Metadata\ConfigMetadata; | |
use Mautic\CoreBundle\DependencyInjection\Builder\Metadata\EntityMetadata; | |
use Mautic\CoreBundle\DependencyInjection\Builder\Metadata\PermissionClassMetadata; | |
class BundleMetadataBuilder | |
{ | |
private array $ipLookupServices = []; | |
private array $ormConfig = []; | |
private array $serializerConfig = []; | |
private array $pluginMetadata = []; | |
/** | |
* @var array | |
*/ | |
private $coreMetadata = []; | |
public function __construct( | |
private array $symfonyBundles, | |
private array $paths | |
) { | |
$this->buildMetadata(); | |
} | |
public function getCoreBundleMetadata(): array | |
{ | |
return $this->coreMetadata; | |
} | |
public function getPluginMetadata(): array | |
{ | |
return $this->pluginMetadata; | |
} | |
public function getIpLookupServices(): array | |
{ | |
return $this->ipLookupServices; | |
} | |
public function getOrmConfig(): array | |
{ | |
return $this->ormConfig; | |
} | |
public function getSerializerConfig(): array | |
{ | |
return $this->serializerConfig; | |
} | |
private function buildMetadata(): void | |
{ | |
foreach ($this->symfonyBundles as $symfonyBundle => $namespace) { | |
// Plugin | |
if (str_contains($namespace, 'MauticPlugin\\')) { | |
$this->pluginMetadata[$symfonyBundle] = $this->buildPluginMetadata($namespace, $symfonyBundle); | |
continue; | |
} | |
// Core bundle | |
if (str_contains($namespace, 'Mautic\\')) { | |
$this->coreMetadata[$symfonyBundle] = $this->buildCoreMetadata($namespace, $symfonyBundle); | |
continue; | |
} | |
// Otherwise not a Mautic bundle so ignore | |
} | |
// Make CoreBundle the first in the core bundle list | |
if (!isset($this->coreMetadata['MauticCoreBundle'])) { | |
// Not always set for tests | |
return; | |
} | |
$coreBundle = $this->coreMetadata['MauticCoreBundle']; | |
unset($this->coreMetadata['MauticCoreBundle']); | |
$this->coreMetadata = array_merge(['MauticCoreBundle' => $coreBundle], $this->coreMetadata); | |
} | |
private function buildPluginMetadata(string $namespace, string $symfonyBundle): array | |
{ | |
$relativePath = $this->paths['plugins'].'/'.$symfonyBundle; | |
$metadataArray = $this->getMetadata(true, $namespace, $symfonyBundle, $symfonyBundle, $relativePath); | |
$metadata = new BundleMetadata($metadataArray); | |
$this->completMetadata($metadata); | |
return $metadata->toArray(); | |
} | |
private function buildCoreMetadata(string $namespace, string $symfonyBundle): array | |
{ | |
$bundleName = str_replace('Mautic', '', $symfonyBundle); | |
$relativePath = $this->paths['bundles'].'/'.$bundleName; | |
$metadataArray = $this->getMetadata(false, $namespace, $symfonyBundle, $bundleName, $relativePath); | |
$metadata = new BundleMetadata($metadataArray); | |
$this->completMetadata($metadata); | |
return $metadata->toArray(); | |
} | |
private function getMetadata(bool $isPlugin, string $namespace, string $symfonyBundle, string $bundleName, string $relativePath): array | |
{ | |
return [ | |
'isPlugin' => $isPlugin, | |
'base' => str_replace('Bundle', '', $bundleName), | |
'bundle' => $bundleName, | |
'relative' => $relativePath, | |
'directory' => realpath($this->paths['root'].'/'.$relativePath), | |
'namespace' => preg_replace('#\\\[^\\\]*$#', '', $namespace), | |
'symfonyBundleName' => $symfonyBundle, | |
'bundleClass' => $namespace, | |
]; | |
} | |
private function completMetadata(BundleMetadata $metadata): void | |
{ | |
$configParser = new ConfigMetadata($metadata); | |
$configParser->build(); | |
if ($foundIpLookupServices = $configParser->getIpLookupServices()) { | |
$this->ipLookupServices = array_merge($foundIpLookupServices, $this->ipLookupServices); | |
} | |
(new PermissionClassMetadata($metadata))->build(); | |
$this->buildMappings($metadata); | |
} | |
private function buildMappings(BundleMetadata $metadata): void | |
{ | |
$mappingParser = new EntityMetadata($metadata); | |
$mappingParser->build(); | |
$bundleName = $metadata->getBundleName(); | |
if ($ormMappings = $mappingParser->getOrmConfig()) { | |
$this->ormConfig[$bundleName] = $ormMappings; | |
} | |
if ($serializerConfig = $mappingParser->getSerializerConfig()) { | |
$this->serializerConfig[$bundleName] = $serializerConfig; | |
} | |
} | |
} | |