2016-07-06 82 views
1

我有一個應用程序,我必須處理多個供應商 - 每個供應商都有其不同的實現。例如,假設Payment Systems,有許多供應商和銀行。Laravel的工廠模式清潔代碼

有一些共同點,比如實施過程。在每種情況下,我都必須給他們一個回叫網址來給我回復。

現在,我有兩個供應商 - 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,它不斷在這裏添加驗證對象。什麼是更乾淨的方式來做到這一點?

我認爲的解決方案之一 - 對於多個路線,我只是創建一個方法。現在我將檢查此方法中的路由並在其上調用Factory對象。

回答

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。這樣當你需要添加更多的時候,你需要做的就是實現這個接口,並且應該告訴你需要寫什麼功能。然後,只需更新您的工廠方法以包含新工廠,即可完成。不再需要更改控制器,添加路由或向控制器添加依賴關係。