2014-11-16 20 views
2

我想通過使用Laravel服務提供商來了解IoC的概念。到目前爲止,我讀過的內容中,應該包含所有依賴於服務提供者中其他類的類創建邏輯。公平和正直,但我想確保我以正確的方式做到這一點。Laravel IoC - 我正在做對嗎?

我的應用程序將使用抽象Tracker類的子項,具體取決於您提供給服務提供者的常量,它應該加載不同的類。這是正確的路嗎?

服務提供商:

class TrackerServiceProvider extends \Illuminate\Support\ServiceProvider { 
    const TRACKER_API = 0; 
    const TRACKER_SITE = 1; 

    public function register() { 
     $this->app->bind('Tracker', function($app, $parameters) { 
      switch($parameters['method']) { 
       case static::TRACKER_API: 
        return new TrackerAPI(new cURL(), new Shipment($parameters['number'])); 

        break; 
       case static::TRACKER_SITE: 
        return new TrackerSite(new cURL(), new Shipment($parameters['number'])); 

        break; 
       default: 
        throw Exception('Unknown tracker method provided.'); 

        break; 
      } 
     }); 
    } 
} 

抽象類跟蹤(只是基地):

abstract class Tracker { 
    protected $curl; 
    protected $shipment; 


    function __construct(cURL $curl, Shipment $shipment) { 
     $this->curl  = $curl; 
     $this->shipment = $shipment; 



    } 
} 

或者我應該建立在register方法兩種不同的綁定,每一個班?就像這樣:

class TrackerServiceProvider extends \Illuminate\Support\ServiceProvider { 
    public function register() { 
     $this->app->bind('TrackerAPI', function($app, $number) { 
      return new TrackerAPI(new cURL(), new Shipment($number)); 
     }); 

     $this->app->bind('TrackerSite', function($app, $parameters) { 
      return new TrackerSite(new cURL(), new Shipment($number)); 
     }); 
    } 
} 

回答

0

我更願意做一個Factory此處從ServiceProvider脫鉤了。下面的代碼只是一個演示,最好不要在下面的TrackerFactory中使用靜態方法。

class TrackerFactory { 
    const TRACKER_API = 0; 
    const TRACKER_SITE = 1; 

    public static function make($parameters) { 
     switch($parameters['method']) { 
      case static::TRACKER_API: 
       return new TrackerAPI(new cURL(), new Shipment($parameters['number'])); 

       break; 
      case static::TRACKER_SITE: 
       return new TrackerSite(new cURL(), new Shipment($parameters['number'])); 

       break; 
      default: 
       throw Exception('Unknown tracker method provided.'); 

       break; 
     } 
    } 
} 

然後只是綁定它。

class TrackerServiceProvider extends \Illuminate\Support\ServiceProvider { 

    public function register() { 
     $this->app->bind('Tracker', function($app, $parameters) { 
      return TrackerFactory::make($parameters) 
     }); 
    } 
}