Php 拉雷维尔国际奥委会-我这样做对吗?

Php 拉雷维尔国际奥委会-我这样做对吗?,php,laravel,inversion-of-control,service-provider,Php,Laravel,Inversion Of Control,Service Provider,我正试图通过使用Laravel服务提供商来学习国际奥委会的概念。到目前为止,我读到的内容是,您应该包含依赖于服务提供者中其他类的所有类创建逻辑。公平公正,但我想确保我做得对 我的应用程序将使用抽象Tracker类的子类,这取决于您向服务提供商提供的常量,它应该加载不同的类。走这条路对吗 服务供应商: class TrackerServiceProvider extends \Illuminate\Support\ServiceProvider { const TRACKER_API =

我正试图通过使用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;
            }
        });
    }
}
抽象跟踪器类(仅是基本类):

或者我应该在
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));
        });
    }
}

我更喜欢在这里创建一个
工厂
,将其与
服务提供商
分离。下面的代码只是一个演示,最好不要在下面的
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)
        });
    }
}
class TrackerServiceProvider extends \Illuminate\Support\ServiceProvider {

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