在 Lumen 中覆盖 composer 包的配置文件

Overriding configuration files of composer packages in Lumen

我有一个安装了外部 Composer 包的 Lumen 项目。与 Lumen 一样,它们存储在 vendor 目录中,每个都在各自的文件夹中。其中一些包有配置文件,我想用自定义的覆盖它们。

我在注册应用程序本身后立即使用 $app->configure() 在我的 bootstrap/app.php 中注册了文件,所以它看起来像这样:

require_once __DIR__ . '/../vendor/autoload.php';

try {
    (new Dotenv\Dotenv(__DIR__ . '/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
    //
}

$app = new Laravel\Lumen\Application(
    realpath(__DIR__ . '/../')
);

$app->withFacades();
$app->withEloquent();

$app->configure('/Configuration/Lumen/app.php');
$app->configure('/Configuration/Lumen/auth.php');
$app->configure('/Configuration/Tymon/jwt.php');

这些文件存在于各自的目录中,包含我希望 Lumen 使用的设置而不是默认设置,它们分别位于:

/vendor/laravel/lumen-framework/config/app.php
/vendor/laravel/lumen-framework/config/auth.php
/vendor/tymon/jwt-auth/config/config.php

我 运行 遇到的问题是,使用此配置,Lumen 似乎忽略了我的自定义文件,而是使用默认值。我在这里做错了什么?

将您的配置文件放在 config/ 中,并按文件名在 bootstrap/app.php 中注册它们,没有 .php 文件结尾。

// Your custom config in config/jwt-auth.php
$app->configure('jwt-auth');

我认为以上任何答案都没有真正回答 OP 想知道如何做的事情。

他们似乎想要的是加载一个 composer 包并将该包配置注册到应用程序中,而无需进行任何类型的手动配置。

有点像当您导入一个标准的 composer 包时,它使用环境变量构建一个记录器并自动配置它的设置,而无需将该配置添加到应用程序。那么事情就简单了。

虽然我假设 OP 知道这会导致一些问题,因为您被配置应用程序的作曲家包困住了,有几个选项可以在本地覆盖这些设置。

但我想您对此感到满意。因此,我想提出这个解决方案

在您的 composer 包中,创建一个 providers 文件夹,然后将此代码添加到 lumen 服务提供商 class,在我的例子中,我将其命名为 TestProvider

<?php declare(strict_types=1);

namespace YourLibrary\Providers;

class TestProvider extends \Illuminate\Support\ServiceProvider
{
    public function boot()
    {
        // Because we're using 'require', this needs to be a valid path
        $path = __DIR__.'/vendor_config.php';
        
        // Get a configuration object from the service container
        $config = app()->make('config');
        
        // An example: Set into the 'app' configuration at a specific subkey
        // just to show you can modify the default app configuration
        $config->set('app.subkey', require $path);
        error_log(json_encode(config('app')));

        // An example: Set into the 'vendor.test' configuration at a specific subkey
        $config->set('vendor.test', require $path);
        error_log(json_encode(config('vendor')));

    }
}

如您所见,您可以对 set() 的第一个参数使用点表示法,以将您的配置插入到应用程序配置中,但在理论上要注意命名原因,我猜您可以覆盖任何设置,例如这可能是您最终覆盖了整个 config('app') 及其所有设置,这将导致部分无法运行的应用程序。

然后在您应用程序的 bootstrap.php 文件中,您需要注册此服务提供商,如下所示:

$app->register(YourLibrary\Providers\TestProvider::class);

我已经使用我在本地开发的应用程序对其进行了测试,它可以正常工作,而且我已经将它用于具有非常静态配置的库,一切都运行良好。