【问题标题】:Cleaner code in Laravel for factory patternLaravel 中用于工厂模式的更简洁的代码
【发布时间】:2016-07-06 19:36:12
【问题描述】:

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

有一些共同点,例如实施过程。在每种情况下,我都必须给他们一个回调 URL 来给我回复。

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

如果我必须添加更多 venodrs,它会继续在此处添加验证器对象。什么是更清洁的方法?

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

【问题讨论】:

    标签: php laravel design-patterns laravel-5


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 2015-10-27
      • 2019-01-17
      相关资源
      最近更新 更多