自己開發了一個Package,其中使用Provider來註冊服務,但是裡面有用到config()方法來獲取配置,問題是這個config文件還沒有被publish,感覺我的思路不對啊。
程式碼如下:
<code>class SuperViewConfigProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // Publish the config file to $this->publishes([ __DIR__.'/../../config/config.php' => config_path('superview.php'), ]); } }</code>
<code>class SuperViewModelProvider extends ServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = true; /** * Register any application services. * * @return void */ public function register() { // Get config, then bind automaticly $models = array_keys(config('superview.models')); foreach ($models as $model) { $this->app->singleton(config('superview.model_prefix') . $model, function($app) use ($models, $model) { return new $models[$model]; }); } } /** * Get the services provided by the provider. * * @return array */ public function provides() { return array_map(function($value) { return config('superview.model_prefix') . $value; }, array_keys(config('superview.models'))); } }</code>
然後我運行: php artisan vendor:publish --provider="SuperViewProvidersSuperViewConfigProvider"
就會報錯了說config內容不存在。
自己開發了一個Package,其中使用Provider來註冊服務,但是裡面有用到config()方法來獲取配置,問題是這個config文件還沒有被publish,感覺我的思路不對啊。
程式碼如下:
<code>class SuperViewConfigProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // Publish the config file to $this->publishes([ __DIR__.'/../../config/config.php' => config_path('superview.php'), ]); } }</code>
<code>class SuperViewModelProvider extends ServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = true; /** * Register any application services. * * @return void */ public function register() { // Get config, then bind automaticly $models = array_keys(config('superview.models')); foreach ($models as $model) { $this->app->singleton(config('superview.model_prefix') . $model, function($app) use ($models, $model) { return new $models[$model]; }); } } /** * Get the services provided by the provider. * * @return array */ public function provides() { return array_map(function($value) { return config('superview.model_prefix') . $value; }, array_keys(config('superview.models'))); } }</code>
然後我運行: php artisan vendor:publish --provider="SuperViewProvidersSuperViewConfigProvider"
就會報錯了說config內容不存在。
在 provider 的 register
方法裡首先呼叫 mergeConfigFrom
:
<code class="php">$this->mergeConfigFrom(__DIR__.'/../../config/config.php', 'superview');</code>
意思是以你包裝裡面的設定檔作為基礎,然後合併使用者app目錄下的配置,最後得到你的 superview 的配置,並且設定在目前的Config儲存中。
你都會寫 ServiceProvider
了 那難道不檢查這個檔案是否存在?
<code>__DIR__.'/../../config/config.php</code>
我不確定,在沒發布config前,這裡能否用到config
<code>public function provides() { return array_map(function($value) { return config('superview.model_prefix') . $value; }, array_keys(config('superview.models'))); }</code>