Laravel 包配置不合并

Laravel package config does not merge

我正在开发几个包,如果要发布它们,我希望为所有这些包创建一个配置文件。

在我的服务提供商内部,我这样做了:

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' => [
        ...
    ]
];

我做错了什么?

为了防止其他人对此感到困惑,我已经测试了几个案例,这里是我的解释 (official docs)。

$this->publishes 部分允许通过 vendor:publish 命令发布包配置。这里没什么好解释的。

$this->mergeConfigFrom 部分使包配置能够与当前发布的副本合并。在这种情况下合并意味着从 Laravel config() 范围合并。

这意味着去 artisan tinker 和 运行 config('key') (其中键是你的配置文件的名称)将 return 如果没有发布的文件和你没有 mergeConfigFrom。如果文件已发布并且包含其他键值对,这些键值对不存在于您的包配置中并且您有 mergeConfigFrom 存在,config('key') 将 return 合并已发布文件中的值数组以及来自您的配置的值。

如果您的根配置文件夹中存在具有相同配置名称的文件,并且您的包在内部使用相同的配置名称但您没有 mergeConfigFromconfig('key') 将 return 仅包含根配置文件夹中的文件内容,并且将忽略包中的所有内容,因为您没有提供 Laravel 将其视为 "global" 配置的方法。您的包将继续在内部使用包配置,但您将无法从应用范围获取它。