Laravel中用于工厂模式的清洁代码

时间:2016-07-06 19:36:13

标签: php laravel design-patterns laravel-5

我有一个应用程序,我必须与多个供应商打交道 - 每个供应商都有不同的实现。例如,假设支付系统,有许多供应商和银行。

有一些常见的事情,比如实施过程。在每种情况下,我都必须给他们一个回调网址,以便给我一个回复。

目前,我有两家供应商 - 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

如果我必须添加更多静电器,它会继续添加验证器对象。什么是更清洁的方式呢?

我认为其中一个解决方案 - 对于多个路由,我只创建一个方法。现在,我将检查此方法中的路径,并在此基础上调用工厂对象。

1 个答案:

答案 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。这样,当您需要添加更多内容时,您需要做的就是实现该接口,并且应该准确地告诉您需要编写哪些函数。然后只需更新您的工厂方法以包含新方法,您就完成了。不再需要更改控制器,添加路由或向控制器添加依赖项。