<?php declare(strict_types=1);namespace Kiener\MolliePayments;use Exception;use Kiener\MolliePayments\Compatibility\DependencyLoader;use Kiener\MolliePayments\Components\Installer\PluginInstaller;use Kiener\MolliePayments\Repository\CustomFieldSet\CustomFieldSetRepository;use Psr\Container\ContainerInterface;use Shopware\Core\Framework\Context;use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;use Shopware\Core\Framework\Migration\MigrationCollection;use Shopware\Core\Framework\Plugin;use Shopware\Core\Framework\Plugin\Context\ActivateContext;use Shopware\Core\Framework\Plugin\Context\DeactivateContext;use Shopware\Core\Framework\Plugin\Context\InstallContext;use Shopware\Core\Framework\Plugin\Context\UninstallContext;use Shopware\Core\Framework\Plugin\Context\UpdateContext;use Shopware\Core\Kernel;use Symfony\Component\DependencyInjection\Container;use Symfony\Component\DependencyInjection\ContainerBuilder;use Symfony\Component\Filesystem\Filesystem;use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;class MolliePayments extends Plugin{ const PLUGIN_VERSION = '4.3.0'; /** * @param ContainerBuilder $container * @throws Exception */ public function build(ContainerBuilder $container): void { parent::build($container); $this->container = $container; # load the dependencies that are compatible # with our current shopware version $loader = new DependencyLoader($this->container); $loader->loadServices(); $loader->prepareStorefrontBuild(); } /** * @return void */ public function boot(): void { parent::boot(); } /** * @param RoutingConfigurator $routes * @param string $environment * @return void */ public function configureRoutes(RoutingConfigurator $routes, string $environment): void { if (!$this->isActive()) { return; } /** @var Container $container */ $container = $this->container; $loader = new DependencyLoader($container); $routeDir = $loader->getRoutesPath($this->getPath()); $fileSystem = new Filesystem(); if ($fileSystem->exists($routeDir)) { $routes->import($routeDir . '/{routes}/*' . Kernel::CONFIG_EXTS, 'glob'); $routes->import($routeDir . '/{routes}/' . $environment . '/**/*' . Kernel::CONFIG_EXTS, 'glob'); $routes->import($routeDir . '/{routes}' . Kernel::CONFIG_EXTS, 'glob'); $routes->import($routeDir . '/{routes}_' . $environment . Kernel::CONFIG_EXTS, 'glob'); } } /** * @param InstallContext $context * @return void */ public function install(InstallContext $context): void { parent::install($context); if ($this->container === null) { throw new Exception('Container is not initialized'); } # that's the only part we use the Shopware repository directly, # and not our custom one, because our repositories are not yet registered in this function /** @var EntityRepository $shopwareRepoCustomFields */ $shopwareRepoCustomFields = $this->container->get('custom_field_set.repository'); if ($shopwareRepoCustomFields !== null) { $mollieRepoCustomFields = new CustomFieldSetRepository($shopwareRepoCustomFields); } $this->runDbMigrations($context->getMigrationCollection()); } /** * @param UpdateContext $context * @throws \Doctrine\DBAL\Exception * @return void */ public function update(UpdateContext $context): void { parent::update($context); if ($context->getPlugin()->isActive() === true) { # only prepare our whole plugin # if it is indeed active at the moment. # otherwise service would not be found of course $this->preparePlugin($context->getContext()); $this->runDbMigrations($context->getMigrationCollection()); } } /** * @param InstallContext $context * @return void */ public function postInstall(InstallContext $context): void { parent::postInstall($context); } /** * @param UninstallContext $context * @return void */ public function uninstall(UninstallContext $context): void { parent::uninstall($context); } /** * @param ActivateContext $context * @throws \Doctrine\DBAL\Exception * @return void */ public function activate(ActivateContext $context): void { parent::activate($context); $this->preparePlugin($context->getContext()); $this->runDbMigrations($context->getMigrationCollection()); } /** * @param DeactivateContext $context * @return void */ public function deactivate(DeactivateContext $context): void { parent::deactivate($context); } /** * @param Context $context * @throws \Doctrine\DBAL\Exception */ private function preparePlugin(Context $context): void { if ($this->container === null) { throw new Exception('Container is not initialized'); } /** @var PluginInstaller $pluginInstaller */ $pluginInstaller = $this->container->get(PluginInstaller::class); $pluginInstaller->install($context); } /** * @param MigrationCollection $migrationCollection * @return void */ private function runDbMigrations(MigrationCollection $migrationCollection): void { $migrationCollection->migrateInPlace(); }}