Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel包配置未合并_Php_Laravel_Service Provider - Fatal编程技术网

Php Laravel包配置未合并

Php Laravel包配置未合并,php,laravel,service-provider,Php,Laravel,Service Provider,我正在开发几个软件包,如果要发布它们,我希望为所有软件包提供一个配置文件 在我的服务提供商内部,我做到了以下几点: public function boot() { $this->publishes([ __DIR__ . '/config/custom.php' => config_path('custom.php'), ]); } public function register() { $this->mergeConfigFrom

我正在开发几个软件包,如果要发布它们,我希望为所有软件包提供一个配置文件

在我的服务提供商内部,我做到了以下几点:

public function boot()
{
    $this->publishes([
        __DIR__ . '/config/custom.php' => config_path('custom.php'),
    ]);
}

public function register()
{
    $this->mergeConfigFrom(
        __DIR__ . '/config/custom.php', 'custom'
    );
}
配置:

return [
    'containers' => [
        ...
    ]
];
当然,如果我发布它,它会创建包含值的文件。但如果文件已存在,且具有不同的密钥:

return [
    'xxxyyy' => [
        ...
    ],
];
出版没有任何作用。我希望它看起来像:

return [
    'xxxyyy' => [
        ...
    ],

    'containers' => [
        ...
    ]
];

我做错了什么?

如果其他人对此感到困惑,我已经测试了几个案例,下面是我的解释()

$this->publishes
部件允许通过
供应商:publish
命令发布包配置。这里没有什么要解释的

$this->mergeConfigFrom
部分允许将包配置与当前发布的副本合并。在这种情况下,合并意味着从Laravel
config()
scope中合并

这意味着,如果没有已发布的文件且您没有
mergeConfigFrom
,则转到
artisan tinker
并运行
config('key')
(其中key是配置文件的名称)将不会返回任何内容。如果某个文件已发布,并且具有包配置中不存在的其他键值对,并且您具有
mergeConfigFrom
present,
config('key')
将返回已发布文件中的值的合并数组以及配置中的值


如果根配置文件夹中存在具有相同配置名称的文件,并且您的包在内部使用相同的配置名称,但您没有
mergeConfigFrom
config('key')
将只返回根配置文件夹中文件的内容,并且将忽略包中的所有内容,因为您没有为Laravel提供将其视为“全局”配置的方法。您的包将在内部使用包配置,但从应用程序范围中无法获取它

如果存在相同名称的配置文件,则
publish
命令不会执行任何操作。它也不合并配置文件,只使用选项
--force
覆盖配置文件。如果它不这样做,那么整个
mergeConfigFrom
方法的意义是什么?什么是“合并”?它允许用户可以覆盖(合并2个文件中的配置值)包中的一些默认配置值,而无需触摸包源代码。包集['foo'=>'bar']的文件配置中的示例,如果用户想要更改
['foo'=>'foobar']
,他们应该在laravel应用程序中发布您的配置文件来实现这一点。
vendor:publish--force
将执行您描述的操作,而不使用
mergeConfigFrom
我的意思是,这是一个函数,它将配置值从2个文件合并到1个文件中,然后在引导时加载到应用程序中,它不会合并文件内容。你没有做错什么