首頁 >後端開發 >php教程 >Laravel 開發package裡使用helper方法config的時候,執行vendor:publish報錯

Laravel 開發package裡使用helper方法config的時候,執行vendor:publish報錯

WBOY
WBOY原創
2016-12-01 00:56:421382瀏覽

自己開發了一個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>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn