Introduce Container Configurator
Container factory is now responsible only for building or loading cached container. Container configuration is done within the ContainerConfigurator [PREMIUM-99]
This commit is contained in:
69
lib/DI/ContainerConfigurator.php
Normal file
69
lib/DI/ContainerConfigurator.php
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DI;
|
||||
|
||||
use MailPoetVendor\Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use MailPoetVendor\Symfony\Component\DependencyInjection\Reference;
|
||||
use MailPoetVendor\Psr\Container\ContainerInterface;
|
||||
|
||||
class ContainerConfigurator implements IContainerConfigurator {
|
||||
|
||||
function getDumpNamespace() {
|
||||
return 'MailPoetGenerated';
|
||||
}
|
||||
|
||||
function getDumpClassname() {
|
||||
return 'FreeCachedContainer';
|
||||
}
|
||||
|
||||
function configure(ContainerBuilder $container) {
|
||||
// Premium plugin services factory
|
||||
$container->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;
|
||||
}
|
||||
}
|
@ -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() {
|
||||
|
14
lib/DI/IContainerConfigurator.php
Normal file
14
lib/DI/IContainerConfigurator.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DI;
|
||||
|
||||
use MailPoetVendor\Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
|
||||
interface IContainerConfigurator {
|
||||
const FREE_CONTAINER_SERVICE_SLUG = 'free_container';
|
||||
const PREMIUM_CONTAINER_SERVICE_SLUG = 'premium_container';
|
||||
|
||||
function configure(ContainerBuilder $container);
|
||||
function getDumpNamespace();
|
||||
function getDumpClassname();
|
||||
}
|
@ -12,6 +12,7 @@ use MailPoet\API\JSON\SuccessResponse;
|
||||
use MailPoet\API\JSON\v1\APITestNamespacedEndpointStubV1;
|
||||
use MailPoet\API\JSON\v2\APITestNamespacedEndpointStubV2;
|
||||
use MailPoet\Config\AccessControl;
|
||||
use MailPoet\DI\ContainerConfigurator;
|
||||
use MailPoetVendor\Symfony\Component\DependencyInjection\Container;
|
||||
use MailPoet\DI\ContainerFactory;
|
||||
use MailPoet\WP\Hooks;
|
||||
@ -35,12 +36,12 @@ class APITest extends \MailPoetTest {
|
||||
} else {
|
||||
$this->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() {
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user