2015-02-11 46 views
1

我正在嘗試添加功能以在應用中啓用插件。爲此,我想爲PluginManager類註冊一個服務提供者,它將掃描/Plugin目錄中的插件,這些插件已被最終用戶「安裝」(即在那裏拖放)。我不希望最終用戶必須手動將每個插件的服務提供商添加到標準提供商陣列等。在環路中註冊Laravel服務提供商

我希望每個安裝的插件都有自己的服務提供商。因此,是否可以在PluginManager的服務提供商的循環中動態註冊這些服務提供商,該服務提供商將添加到標準提供商數組中?可能使用App :: register()方法?

這是僞代碼,但我想沿着線的東西:

PluginManagerServiceProvider.php

<?php namespace Plugins; 

use Illuminate\Support\ServiceProvider; 

class PluginManagerServiceProvider extends ServiceProvider { 

    public function register() 
    { 
     $this->app->singleton('PluginManager', function($app) 
     { 
      return new PluginManager(); 
     }); 

     $pluginManager = $this->app->make('PluginManager'); 

     // Register other plugin Service Providers in a loop here? 
     foreach ($pluginManager->getInstalledPlugins() as $plugin) 
     { 
      $this->app->register($plugin->getServiceProviderPath); 
     } 

    } 

} 

你覺得呢?我是否完全錯誤地進行了這個?

+0

對於它的價值,我個人沒有看到你在做什麼的問題。我剛剛在4.2版本上做了一個快速測試,結果顯示,將插件服務提供程序添加到'app/config/app.php'並在其中註冊其他服務提供程序實際上會激發動態註冊的插件提供程序,這樣做對你來說沒有任何問題。 – 2015-02-11 16:21:38

回答

3

你有沒有嘗試使用:

App::register('FooServiceProvider'); 

?如果您的提供商是自動加載的,那應該會有訣竅。如果他們不是,你很可能不得不手動自動加載他們,然後在他們每個人上面調用。

+0

這在手冊條目[here](http://laravel.com/docs/4.2/ioc)中的4.2下標題_運行時註冊服務提供商__ – 2015-02-11 16:03:39

+0

@MaksymCierzniak這就是我在循環上面,但使用_ $ this-> app-> register($ plugin-> getServiceProviderPath); _而不是App facade,因爲$ this-> app已經可用。我的問題是,以單一服務提供者(在這種情況下爲PluginManagerServiceProvider)註冊方法的方式加載其他服務提供者是否可行? – dpstudio 2015-02-11 16:07:44

+0

另外,是否可以實例化它的服務提供者中的PluginManager類(**例如**,我有'$ pluginManager = $ this-> app-> make('PluginManager');'? – dpstudio 2015-02-11 16:12:24