Mezzio的开发模式模块指南

83 阅读2分钟

昨天我在Laminas Slack上回答了一个问题,我意识到这很可能是一篇博文。 这个问题是:"在Mezzio中是否有办法注册开发模式的模块?

有什么办法可以在Mezzio中注册只有开发模式的模块吗?

其实有多种方法,但有一种方法可能比其他方法更可取。

有条件的ConfigProviders

我们已经在Mezzio的骨架应用程序中提供了一种模式,如果该类存在,就有条件地包括mezzio-swoole ConfigProvider

class_exists(\Some\ConfigProvider::class)
    ? \Some\ConfigProvider::class
    : function (): array { return []; },

另外,你也可以将其表达为匿名函数:

function (): array {
    if (class_exists(\Some\ConfigProvider::class)) {
        return (new \Some\ConfigProvider())();
    }
    return [];
},

(提供给ConfigAggregator 构造函数的值既可以是配置提供者的字符串类名,也可以是返回数组的函数,这就是为什么这两种方法都可以工作)。

如果配置提供者只作为require-dev 依赖关系安装,这种方法主要是有用的。但如果你在自己的代码中定义配置提供者,而且它总是存在的,怎么办?

开发模式下的配置聚合

另一种可能性是围绕laminas-development-mode与Mezzio的工作方式做一些 "黑客"。 Mezzio中的laminas-development-mode与config/autoload/development.local.php.dist 文件一起工作;启用开发模式后,将config/autoload/development.local.php符号链接到该文件。该文件只需要返回一个数组。因此,你完全可以用你在主配置文件中使用的相同工具编写它来聚合其他配置提供者,以及一些默认开发配置:

// in config/autoload/development.local.php.dist:

declare(strict_types=1);

use Laminas\ConfigAggregator\ArrayProvider;
use Laminas\ConfigAggregator\ConfigAggregator;

$developmentConfig = [
    // app-level development config you want to define
];

$aggregator = new ConfigAggregator([
    // any ConfigProviders you want to list, then:
    new ArrayProvider($developmentConfig),
]);

return $aggregator->getMergedConfig();

这种方法可能是最好用的,因为它在你的主配置中更清楚地说明了什么是默认模块,而且任何只用于开发的模块现在都在这个文件中列出。