The following code snippet is about adding rules that filters Payment Methods listing to customer, for email we provide 4 different types of payment methods, but we do show them depending on some rules.
<?php
namespace App\Services\Checkout\Module;
use App\Services\Checkout\Module\PaymentMethodRules\PaymentMethodRule;
class PaymentMethodRuleManager
{
/**
* @var PaymentMethodList
*/
private $list = [];
/**
* @var PaymentMethodList
*/
private $blackList = [];
/**
* @var PaymentMethodRule[]
*/
private $rules = [];
/**
* PaymentRuleManager constructor.
* @param PaymentMethodList $list
* @param PaymentMethodList $blackList
*/
public function __construct(PaymentMethodList $list, PaymentMethodList $blackList)
{
$this->list = $list;
$this->blackList = $blackList;
}
/**
* @return array
*/
public function filter()
{
return array_diff($this->list->get(), $this->blackList->get());
}
/**
* @return PaymentMethodList
*/
public function getList()
{
return $this->list;
}
/**
* @return PaymentMethodList
*/
public function getBlackList()
{
return $this->blackList;
}
/**
* @param PaymentMethodRule $rule
* @return $this
*/
public function addRule(PaymentMethodRule $rule)
{
$this->rules[] = $rule;
return $this;
}
public function applyRules()
{
foreach ($this->rules as $rule) {
$rule->run($this);
}
}
}
namespace App\Services\Checkout\Module\PaymentMethodRules;
use App\Library\Payment\Method;
use App\Services\Checkout\Module\PaymentMethodRuleManager;
class AdminRule implements PaymentMethodRule
{
/**
* @var boolean
*/
private $isAdmin;
/**
* @var bool
*/
private $isBankTransferAvailable;
/**
* @param boolean $isAdmin
* @param bool $isBankTransferAvailable
*/
public function __construct($isAdmin, $isBankTransferAvailable)
{
$this->isAdmin = $isAdmin;
$this->isBankTransferAvailable = $isBankTransferAvailable;
}
/**
* @param PaymentMethodRuleManager $paymentMethodRuleManager
*/
public function run(PaymentMethodRuleManager $paymentMethodRuleManager)
{
if ($this->isAdmin) {
$paymentMethodRuleManager->getList()->add([Method::INVOICE]);
}
if ($this->isAdmin && $this->isBankTransferAvailable) {
$paymentMethodRuleManager->getList()->add([Method::BANK_TRANSFER]);
}
}
}
[[Test]]
<?php
namespace tests\Services\Checkout\Module;
use App\Library\Payment\Method;
use App\Services\Checkout\Module\PaymentMethodList;
use App\Services\Checkout\Module\PaymentMethodRuleManager;
use App\Services\Checkout\Module\PaymentMethodRules\AdminRule;
class AdminRuleTest extends \PHPUnit_Framework_TestCase
{
const IS_ADMIN = true;
const IS_NOT_ADMIN = false;
const IS_BANK_TRANSFER = true;
const IS_NOT_BANK_TRANSFER = false;
/**
* @test
* @dataProvider runDataProvider
*
* @param bool $isAdmin
* @param bool $isBankTransferAvailable
* @param array $expected
*/
public function runApplies($isAdmin, $isBankTransferAvailable, $expected)
{
$paymentMethodRuleManager = new PaymentMethodRuleManager(
new PaymentMethodList([]),
new PaymentMethodList([])
);
$adminRule = new AdminRule($isAdmin, $isBankTransferAvailable);
$adminRule->run($paymentMethodRuleManager);
$this->assertEquals($expected, $paymentMethodRuleManager->getList()->get());
}
/**
* @return array
*/
public function runDataProvider()
{
return [
[self::IS_ADMIN, self::IS_BANK_TRANSFER, [Method::INVOICE, Method::BANK_TRANSFER]],
[self::IS_ADMIN, self::IS_NOT_BANK_TRANSFER, [Method::INVOICE]],
[self::IS_NOT_ADMIN, self::IS_BANK_TRANSFER, []],
[self::IS_NOT_ADMIN, self::IS_NOT_BANK_TRANSFER, []]
];
}
}
PaymentMethodRuleManager
class. This question doesn't make much sense without it. \$\endgroup\$