2014-11-16 2 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

나는 ServiceProvider에서 디커플링에 여기 Factory을하는 것을 선호합니다. 다음 코드는 데모입니다. 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) 
     }); 
    } 
} 
관련 문제