欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Laravel 开发package里使用helper方法config的时候,运行vendor:publish报错

程序员文章站 2022-05-14 23:11:32
...
自己开发了一个Package,其中使用Provider来注册服务,但是里面有用到config()方法来获取配置,问题是这个config文件还没有被publish,感觉我的思路不对啊。
代码如下:
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'),
        ]);
    }
}
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')));
    }
}

然后我运行: php artisan vendor:publish --provider="SuperViewProvidersSuperViewConfigProvider"
就会报错了说config内容不存在。

回复内容:

自己开发了一个Package,其中使用Provider来注册服务,但是里面有用到config()方法来获取配置,问题是这个config文件还没有被publish,感觉我的思路不对啊。
代码如下:

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'),
        ]);
    }
}
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')));
    }
}

然后我运行: php artisan vendor:publish --provider="SuperViewProvidersSuperViewConfigProvider"
就会报错了说config内容不存在。

在 provider 的 register 方法里首先调用 mergeConfigFrom

$this->mergeConfigFrom(__DIR__.'/../../config/config.php', 'superview');

意思是以你包里面的配置文件作为基础,然后合并用户app目录下的配置,最终得到你的 superview 的配置,并且设置在当前的Config存储中。

你都会写 ServiceProvider了 那难道不检查这个文件是否存在?

__DIR__.'/../../config/config.php

我不确定,在没发布config前,这里能否用到config

public function provides()
{
        return array_map(function($value) {
            return config('superview.model_prefix') . $value;
        }, array_keys(config('superview.models')));
}
相关标签: laravel php