Php 如何使程序包配置合并它';是否将不存在的密钥保存到laravel 7.x中的应用程序配置文件中?

Php 如何使程序包配置合并它';是否将不存在的密钥保存到laravel 7.x中的应用程序配置文件中?,php,laravel,Php,Laravel,我正在开发一些软件包,使我的应用程序更加模块化,允许用户动态启用/禁用它们,或者在需要时安装其他软件包 其中一些包需要用户配置某些属性(例如api键),因此我希望包将其配置键和值写入/config/packages.php文件(如果键还不存在) 根据我从laravel文档中了解的情况(尽管有点模糊),我可以使用: $this->mergeConfigFrom(__DIR__.'/config/config.php', 'packages'); 或 在我的包ServiceProvider类

我正在开发一些软件包,使我的应用程序更加模块化,允许用户动态启用/禁用它们,或者在需要时安装其他软件包

其中一些包需要用户配置某些属性(例如api键),因此我希望包将其配置键和值写入
/config/packages.php
文件(如果键还不存在)

根据我从laravel文档中了解的情况(尽管有点模糊),我可以使用:

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

在我的包
ServiceProvider
类的
register()
方法中

此外,我还添加了一个
echo“called”
register()
方法,以便检查代码是否实际执行

接下来我运行
compose dump autoload
,我在日志输出中看到
调用了
,但是当我检查
/config/packages.php
文件时,它仍然有空数组

使用
php-artisan-config:clear
然后再次运行
compose-dump-autoload
也没有什么区别

如何使包配置将其不存在的键合并到
/config/packages.php
文件中

这是我的包配置文件的一个示例:

<?php

return [
    'shoutzor' => [
        'acoustid' => [
            'apikey'  => env('SHOUTZOR_ACOUSTID_APIKEY', '')
        ]
    ]
];
您(或用户)需要运行命令
php artisan vendor:publish
,然后才能发布包的配置文件(复制到
config
文件夹或指定的文件夹中)

现在,当包的用户执行Laravel的
vendor:publish
命令时,文件将复制到指定的发布位置

如果要发布特定的包供应商文件,只需将包服务提供程序作为选项传递给命令:

php artisan vendor:publish --provider="Your\Package\ServiceProvider"
重要的 如果要发布的文件已存在于目标文件夹中,则需要使用
--force
选项运行命令:

php artisan vendor:publish --force

尝试一下,它会显示在列表中,当我选择它时,它会显示“发布完成”。然而,
/config/packages.php
文件仍然是一个空数组。编辑:我在问题中添加了一个配置示例,如果配置文件已经存在,
$this->publishes()
命令不会添加缺少的键。这意味着每个包都有单独的配置文件。没有办法把这些结合起来吗?(即:合并缺少的键)使用
--force
选项运行命令以覆盖配置文件(如果配置文件已存在),force将替换用户添加的自定义值。所以没有办法合并它们?如果不是,这也是一个答案;)至少我不会再被什么都不发生的事情所困扰。如果你想合并,请使用
$this->mergeConfigFrom()
而不是你误解了
mergeConfigFrom
。这不是要将非包发布的配置与包配置合并
mergeConfigFrom
允许您将自己的包配置文件与应用程序发布的副本合并。这将允许您的用户仅在已发布的配置副本中定义他们实际要覆盖的选项。啊,是的,似乎就是这样。当谈到
publishes
mergeConfigFrom
之间的区别时,我发现很难理解文档。如果合并包并在以后删除它们,将为您提供受污染的配置。我不推荐这个,说得对。虽然在我的应用程序中,我不希望用户对这些软件包进行太多更改。但我会看看是否有更好的方法来解决这个问题。构建包的方法就像为一个愤怒的开源社区编写包一样;)
php artisan vendor:publish --provider="Your\Package\ServiceProvider"
php artisan vendor:publish --force