diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php new file mode 100644 index 0000000000..ee02fee9aa --- /dev/null +++ b/lib/DI/ContainerConfigurator.php @@ -0,0 +1,69 @@ +register(IContainerConfigurator::PREMIUM_CONTAINER_SERVICE_SLUG) + ->setSynthetic(true) + ->setPublic(true); + // Container wrapper service + $container->register(ContainerWrapper::class) + ->setPublic(true) + ->setFactory([ + ContainerWrapper::class, + 'getInstance' + ]); + // API + $container->autowire(\MailPoet\API\JSON\API::class) + ->addArgument(new Reference(ContainerWrapper::class)) + ->setAutowired(true) + ->setPublic(true); + $container->autowire(\MailPoet\API\MP\v1\API::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\AutomatedLatestContent::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\CustomFields::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Forms::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\ImportExport::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Mailer::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\MP2Migrator::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Newsletters::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\NewsletterTemplates::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Segments::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\SendingQueue::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Services::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Settings::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Setup::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Subscribers::class)->setPublic(true); + // Config + $container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true); + // Cron + $container->autowire(\MailPoet\Cron\Daemon::class)->setPublic(true); + $container->autowire(\MailPoet\Cron\DaemonHttpRunner::class)->setPublic(true); + // Router + $container->autowire(\MailPoet\Router\Endpoints\CronDaemon::class)->setPublic(true); + $container->autowire(\MailPoet\Router\Endpoints\Subscription::class)->setPublic(true); + $container->autowire(\MailPoet\Router\Endpoints\Track::class)->setPublic(true); + $container->autowire(\MailPoet\Router\Endpoints\ViewInBrowser::class)->setPublic(true); + // Subscribers + $container->autowire(\MailPoet\Subscribers\NewSubscriberNotificationMailer::class)->setPublic(true); + $container->autowire(\MailPoet\Subscribers\ConfirmationEmailMailer::class)->setPublic(true); + $container->autowire(\MailPoet\Subscribers\RequiredCustomFieldValidator::class)->setPublic(true); + // Newsletter + $container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true); + return $container; + } +} diff --git a/lib/DI/ContainerFactory.php b/lib/DI/ContainerFactory.php index 1fe3cd012d..b6fc8abb8c 100644 --- a/lib/DI/ContainerFactory.php +++ b/lib/DI/ContainerFactory.php @@ -4,18 +4,11 @@ namespace MailPoet\DI; use MailPoetVendor\Symfony\Component\DependencyInjection\ContainerBuilder; use MailPoetVendor\Symfony\Component\DependencyInjection\Dumper\PhpDumper; -use MailPoetVendor\Symfony\Component\DependencyInjection\Reference; class ContainerFactory { - /** @var ContainerBuilder */ - private $container; - - /** @var string */ - private $dump_file = 'CachedContainer.php'; - - /** @var string */ - private $dump_class = 'CachedContainer'; + /** @var IContainerConfigurator */ + private $configurator; /** @var bool */ private $debug; @@ -24,66 +17,24 @@ class ContainerFactory { * ContainerFactory constructor. * @param bool $debug */ - public function __construct($debug = false) { + public function __construct(IContainerConfigurator $configurator, $debug = false) { $this->debug = $debug; + $this->configurator = $configurator; } function getContainer() { - if($this->container) { - return $this->container; - } - - $dump_file = __DIR__ . '/' . $this->dump_file; - if(!$this->debug && file_exists($dump_file)) { - require_once $dump_file; - $this->container = new $this->dump_class(); + $dump_class = '\\'. $this->configurator->getDumpNamespace() . '\\' . $this->configurator->getDumpClassname(); + if(!$this->debug && class_exists($dump_class)) { + $container = new $dump_class(); } else { - $this->container = $this->createContainer(); - $this->container->compile(); + $container = $this->getConfiguredContainer(); + $container->compile(); } - - return $this->container; + return $container; } - function createContainer() { - $container = new ContainerBuilder(); - // API - $container->autowire(\MailPoet\API\MP\v1\API::class)->setPublic(true); - $container->register(\MailPoet\API\JSON\API::class) - ->addArgument(new Reference('service_container')) - ->setAutowired(true) - ->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\AutomatedLatestContent::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\CustomFields::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Forms::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\ImportExport::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Mailer::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\MP2Migrator::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Newsletters::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\NewsletterTemplates::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Segments::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\SendingQueue::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Services::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Settings::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Setup::class)->setPublic(true); - $container->autowire(\MailPoet\API\JSON\v1\Subscribers::class)->setPublic(true); - // Config - $container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true); - // Cron - $container->autowire(\MailPoet\Cron\Daemon::class)->setPublic(true); - $container->autowire(\MailPoet\Cron\DaemonHttpRunner::class)->setPublic(true); - // Router - $container->autowire(\MailPoet\Router\Endpoints\CronDaemon::class)->setPublic(true); - $container->autowire(\MailPoet\Router\Endpoints\Subscription::class)->setPublic(true); - $container->autowire(\MailPoet\Router\Endpoints\Track::class)->setPublic(true); - $container->autowire(\MailPoet\Router\Endpoints\ViewInBrowser::class)->setPublic(true); - // Subscribers - $container->autowire(\MailPoet\Subscribers\NewSubscriberNotificationMailer::class)->setPublic(true); - $container->autowire(\MailPoet\Subscribers\ConfirmationEmailMailer::class)->setPublic(true); - $container->autowire(\MailPoet\Subscribers\RequiredCustomFieldValidator::class)->setPublic(true); - // Newsletter - $container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true); - return $container; + function getConfiguredContainer() { + return $this->configurator->configure(new ContainerBuilder()); } function dumpContainer() { diff --git a/lib/DI/IContainerConfigurator.php b/lib/DI/IContainerConfigurator.php new file mode 100644 index 0000000000..c28eada5ec --- /dev/null +++ b/lib/DI/IContainerConfigurator.php @@ -0,0 +1,14 @@ +wp_user_id = $wp_user_id; } - $container_factory = new ContainerFactory(); - $this->container = $container_factory->createContainer(); + $container_factory = new ContainerFactory(new ContainerConfigurator()); + $this->container = $container_factory->getConfiguredContainer(); $this->container->autowire(APITestNamespacedEndpointStubV1::class)->setPublic(true); $this->container->autowire(APITestNamespacedEndpointStubV2::class)->setPublic(true); $this->container->compile(); - $this->api = $this->container->get(\MailPoet\API\JSON\API::class); + $this->api = new \MailPoet\API\JSON\API($this->container, $this->container->get(AccessControl::class)); } function testItCallsAPISetupAction() { diff --git a/tests/integration/Router/RouterTest.php b/tests/integration/Router/RouterTest.php index 62038fdf06..6a71a39200 100644 --- a/tests/integration/Router/RouterTest.php +++ b/tests/integration/Router/RouterTest.php @@ -5,6 +5,7 @@ namespace MailPoet\Test\Router; use Codeception\Stub; use Codeception\Stub\Expected; use MailPoet\Config\AccessControl; +use MailPoet\DI\ContainerConfigurator; use MailPoetVendor\Symfony\Component\DependencyInjection\Container; use MailPoet\DI\ContainerFactory; use MailPoet\Router\Endpoints\RouterTestMockEndpoint; @@ -26,8 +27,8 @@ class RouterTest extends \MailPoetTest { 'data' => base64_encode(json_encode(array('data' => 'dummy data'))) ); $this->access_control = new AccessControl(); - $container_factory = new ContainerFactory(true); - $this->container = $container_factory->createContainer(); + $container_factory = new ContainerFactory(new ContainerConfigurator()); + $this->container = $container_factory->getConfiguredContainer(); $this->container->register(RouterTestMockEndpoint::class)->setPublic(true); $this->container->compile(); $this->router = new Router($this->access_control, $this->container, $this->router_data);