【问题标题】:Laravel IoC - am I doing this right?Laravel IoC - 我这样做对吗?
【发布时间】:2015-01-13 19:37:25
【问题描述】:

我正在尝试通过使用 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;
            }
        });
    }
}

抽象的 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));
        });
    }
}

【问题讨论】:

    标签: php laravel inversion-of-control service-provider


    【解决方案1】:

    我更喜欢在这里创建一个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)
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2023-03-19
      • 1970-01-01
      • 2015-06-09
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多