Laravel IoC — я делаю это правильно?

Я пытаюсь изучить концепции 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));
});
}
}

2

Решение

Я предпочитаю сделать 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)
});
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]