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 合并已发布文件中的值数组以及来自您的配置的值。
如果您的根配置文件夹中存在具有相同配置名称的文件,并且您的包在内部使用相同的配置名称但您没有 mergeConfigFrom
,config('key')
将 return 仅包含根配置文件夹中的文件内容,并且将忽略包中的所有内容,因为您没有提供 Laravel 将其视为 "global" 配置的方法。您的包将继续在内部使用包配置,但您将无法从应用范围获取它。
我正在开发几个包,如果要发布它们,我希望为所有这些包创建一个配置文件。
在我的服务提供商内部,我这样做了:
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 合并已发布文件中的值数组以及来自您的配置的值。
如果您的根配置文件夹中存在具有相同配置名称的文件,并且您的包在内部使用相同的配置名称但您没有 mergeConfigFrom
,config('key')
将 return 仅包含根配置文件夹中的文件内容,并且将忽略包中的所有内容,因为您没有提供 Laravel 将其视为 "global" 配置的方法。您的包将继续在内部使用包配置,但您将无法从应用范围获取它。