Use DI to create WooCommerce event emails

[MAILPOET-3924]
This commit is contained in:
Jan Jakes
2021-12-09 15:23:34 +01:00
committed by Veljko V
parent 946f6c2cf9
commit be59a1a46a
6 changed files with 69 additions and 13 deletions

View File

@@ -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 {

View 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;
}
}
}

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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;
}
}