Я пытаюсь изучить концепции IoC, используя поставщиков услуг Laravel. То, что я прочитал до сих пор, вы должны содержать всю логику создания классов, которая зависит от других классов в поставщиках услуг. Справедливо и честно, но я хочу убедиться, что делаю это правильно.
Мое приложение будет использовать детей абстрактного 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;
}
});
}
}
Абстрактный класс Tracker (просто база):
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));
});
}
}
Я предпочитаю сделать 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)
});
}
}
Других решений пока нет …