我有一个应用程序,我必须与多个供应商打交道 - 每个供应商都有不同的实现。例如,假设支付系统,有许多供应商和银行。
有一些常见的事情,比如实施过程。在每种情况下,我都必须给他们一个回调网址,以便给我一个回复。
目前,我有两家供应商 - VendorPay和VendorA。
我将有两条路线:
payment/callback/vendorpay
payment/callback/vendora
他们每个人都在控制器中调用两个方法。
processVendorpay and processVendora
现在,如果我想添加15个像这样的供应商,我每次添加新供应商时都必须创建方法吗?对此有没有更清洁的解决方案?
我的控制器现在看起来像这样:
class PaymentController extends BaseController
{
protected $vendorpay_validator, $vendora_validator, $transaction, $transaction_log, $vendor_product, $vendor_transaction;
public function __construct(VendorpayValidator $vendorpay_validator, VendorAValidator $vendora_validator, Transaction $transaction, TransactionLog $transaction_log, VendorProduct $vendor_product, VendorTransaction $vendor_transaction)
{
$this->vendorpay_validator = $vendorpay_validator;
$this->vendora_validator = $vendora_validator;
$this->transaction = $transaction;
$this->transaction_log = $transaction_log;
$this->vendor_product = $vendor_product;
$this->vendor_transaction = $vendor_transaction;
}
}
这四个是模型存储库对象:$transaction, $transaction_log, $vendor_product, $vendor_transaction
如果我必须添加更多静电器,它会继续添加验证器对象。什么是更清洁的方式呢?
我认为其中一个解决方案 - 对于多个路由,我只创建一个方法。现在,我将检查此方法中的路径,并在此基础上调用工厂对象。
答案 0 :(得分:1)
你应该只有一条路线......
payment/callback/{vendor}
那么如果你想走工厂路线(在这种情况下我认为这是一个好主意)......
class VendorValidatorFactory
{
private function __construct() {}
public static function getValidator($vendor)
{
switch ($vendor) {
case 'vendorpay':
return new VendorPayValidator;
case 'vendora':
return new VendarAValidator;
}
}
}
从构造函数中删除现在不必要的注入,并在响应路由的方法中,使用工厂获取正确的验证器......
class SomeController extends Controller
{
public function __construct(Transaction $transaction, TransactionLog $transaction_log, VendorProduct $vendor_product, VendorTransaction $vendor_transaction)
{
$this->transaction = $transaction;
$this->transaction_log = $transaction_log;
$this->vendor_product = $vendor_product;
$this->vendor_transaction = $vendor_transaction;
}
public function processVendorResponse($vendor)
{
$validator = VendorValidatorFactory::getValidator($vendor);
}
}
只是一个建议,每当您需要向控制器使用的验证器类添加新方法时,请将其添加到ValidatorInterface
并确保所有验证器都实现ValidatorInterface
。这样,当您需要添加更多内容时,您需要做的就是实现该接口,并且应该准确地告诉您需要编写哪些函数。然后只需更新您的工厂方法以包含新方法,您就完成了。不再需要更改控制器,添加路由或向控制器添加依赖项。