Use DI to create WooCommerce event emails
[MAILPOET-3924]
This commit is contained in:
@@ -28,13 +28,18 @@ class WooCommerce {
|
||||
/** @var WPFunctions */
|
||||
private $wp;
|
||||
|
||||
/** @var WooCommerceEventFactory */
|
||||
private $eventFactory;
|
||||
|
||||
public function __construct(
|
||||
WPFunctions $wp,
|
||||
WooCommerceHelper $woocommerceHelper
|
||||
WooCommerceHelper $woocommerceHelper,
|
||||
WooCommerceEventFactory $eventFactory
|
||||
) {
|
||||
$this->wp = $wp;
|
||||
$this->woocommerceHelper = $woocommerceHelper;
|
||||
$this->woocommerceEnabled = $this->isWoocommerceEnabled();
|
||||
$this->eventFactory = $eventFactory;
|
||||
}
|
||||
|
||||
public function init() {
|
||||
@@ -70,19 +75,15 @@ class WooCommerce {
|
||||
] : [];
|
||||
|
||||
foreach ($this->availableEvents as $event) {
|
||||
$eventClass = sprintf(
|
||||
'%s\Events\%s',
|
||||
__NAMESPACE__,
|
||||
$event
|
||||
);
|
||||
$eventInstance = in_array($event, $this->availableEvents, true)
|
||||
? $this->eventFactory->createEvent($event)
|
||||
: null;
|
||||
|
||||
if (!class_exists($eventClass)) {
|
||||
if (!$eventInstance) {
|
||||
$this->displayEventWarning($event);
|
||||
continue;
|
||||
}
|
||||
|
||||
$eventInstance = new $eventClass();
|
||||
|
||||
if (method_exists($eventInstance, 'init')) {
|
||||
$eventInstance->init();
|
||||
} else {
|
||||
|
39
lib/AutomaticEmails/WooCommerce/WooCommerceEventFactory.php
Normal file
39
lib/AutomaticEmails/WooCommerce/WooCommerceEventFactory.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace MailPoet\AutomaticEmails\WooCommerce;
|
||||
|
||||
use MailPoet\AutomaticEmails\WooCommerce\Events\AbandonedCart;
|
||||
use MailPoet\AutomaticEmails\WooCommerce\Events\FirstPurchase;
|
||||
use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedInCategory;
|
||||
use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedProduct;
|
||||
use MailPoet\DI\ContainerWrapper;
|
||||
use MailPoetVendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
|
||||
|
||||
class WooCommerceEventFactory {
|
||||
public const EVENTS_MAP = [
|
||||
'AbandonedCart' => AbandonedCart::class,
|
||||
'FirstPurchase' => FirstPurchase::class,
|
||||
'PurchasedInCategory' => PurchasedInCategory::class,
|
||||
'PurchasedProduct' => PurchasedProduct::class,
|
||||
];
|
||||
|
||||
/** @var ContainerWrapper */
|
||||
private $container;
|
||||
|
||||
public function __construct(
|
||||
ContainerWrapper $container
|
||||
) {
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
/** @return object|null */
|
||||
public function createEvent(string $eventName) {
|
||||
$eventClass = self::EVENTS_MAP[$eventName] ?? null;
|
||||
|
||||
try {
|
||||
return $eventClass ? $this->container->get($eventClass) : null;
|
||||
} catch (ServiceNotFoundException $e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@@ -94,6 +94,11 @@ class ContainerConfigurator implements IContainerConfigurator {
|
||||
$container->autowire(\MailPoet\AutomaticEmails\AutomaticEmails::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\AutomaticEmails\AutomaticEmailFactory::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\AutomaticEmails\WooCommerce\WooCommerce::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\AutomaticEmails\WooCommerce\WooCommerceEventFactory::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\AbandonedCart::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\FirstPurchase::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedInCategory::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedProduct::class)->setPublic(true);
|
||||
// Config
|
||||
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);
|
||||
|
@@ -5,6 +5,7 @@ namespace MailPoet\API\JSON\v1;
|
||||
use MailPoet\AutomaticEmails\AutomaticEmailFactory;
|
||||
use MailPoet\AutomaticEmails\AutomaticEmails as AutomaticEmailsController;
|
||||
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
|
||||
use MailPoet\AutomaticEmails\WooCommerce\WooCommerceEventFactory;
|
||||
use MailPoet\WooCommerce\Helper;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
@@ -17,8 +18,9 @@ class AutomaticEmailsTest extends \MailPoetTest {
|
||||
public function _before() {
|
||||
$this->wp = new WPFunctions;
|
||||
|
||||
$wooCommerceEventFactory = $this->diContainer->get(WooCommerceEventFactory::class);
|
||||
$automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [
|
||||
'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper()),
|
||||
'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper(), $wooCommerceEventFactory),
|
||||
]);
|
||||
$this->api = new AutomaticEmails(new AutomaticEmailsController($this->wp, $automaticEmailFactory), $this->wp);
|
||||
}
|
||||
|
@@ -3,6 +3,7 @@
|
||||
namespace MailPoet\AutomaticEmails;
|
||||
|
||||
use MailPoet\AutomaticEmails\WooCommerce\WooCommerce;
|
||||
use MailPoet\AutomaticEmails\WooCommerce\WooCommerceEventFactory;
|
||||
use MailPoet\WooCommerce\Helper;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
@@ -10,13 +11,17 @@ class AutomaticEmailsTest extends \MailPoetTest {
|
||||
public $wp;
|
||||
public $AM;
|
||||
|
||||
/** @var WooCommerceEventFactory */
|
||||
private $wooCommerceEventFactory;
|
||||
|
||||
/** @var AutomaticEmailFactory */
|
||||
private $automaticEmailFactory;
|
||||
|
||||
public function _before() {
|
||||
$this->wp = new WPFunctions();
|
||||
$this->wooCommerceEventFactory = $this->diContainer->get(WooCommerceEventFactory::class);
|
||||
$this->automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [
|
||||
'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper()),
|
||||
'createWooCommerceEmail' => new WooCommerce($this->wp, new Helper(), $this->wooCommerceEventFactory),
|
||||
]);
|
||||
$this->AM = new AutomaticEmails($this->wp, $this->automaticEmailFactory);
|
||||
}
|
||||
|
@@ -12,12 +12,16 @@ use MailPoet\WooCommerce\Helper;
|
||||
use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
class WooCommerceTest extends \MailPoetTest {
|
||||
/** @var WooCommerceEventFactory */
|
||||
private $wooCommerceEventFactory;
|
||||
|
||||
/** @var AutomaticEmailFactory */
|
||||
private $automaticEmailFactory;
|
||||
|
||||
public function _before() {
|
||||
$this->wooCommerceEventFactory = $this->diContainer->get(WooCommerceEventFactory::class);
|
||||
$this->automaticEmailFactory = $this->makeEmpty(AutomaticEmailFactory::class, [
|
||||
'createWooCommerceEmail' => new WooCommerce(new WPFunctions(), new Helper()),
|
||||
'createWooCommerceEmail' => new WooCommerce(new WPFunctions(), new Helper(), $this->wooCommerceEventFactory),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -103,7 +107,7 @@ class WooCommerceTest extends \MailPoetTest {
|
||||
|
||||
private function createWooCommerceEmailMock(bool $isWoocommerceEnabled = true): WooCommerce {
|
||||
$mock = $this->make(WooCommerce::class, ['isWoocommerceEnabled' => $isWoocommerceEnabled]);
|
||||
$mock->__construct(new WPFunctions(), new Helper());
|
||||
$mock->__construct(new WPFunctions(), new Helper(), $this->wooCommerceEventFactory);
|
||||
return $mock;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user