cadre/module

此包已被废弃,不再维护。没有建议的替代包。

基于 Aura.Di 的模块系统

0.5.3 2017-07-09 03:50 UTC

This package is not auto-updated.

Last update: 2020-04-14 01:57:43 UTC


README

这是一个基于 Aura.Di 的轻量级模块系统。

此库定义了几个类,这些类实现了 Aura\Di\ContainerConfigInterface,因此它可以在使用 Aura.Di 的任何项目中使用。

由于此项目处于早期开发阶段,请通过 问题 提供反馈。

安装和自动加载

此包可通过 Composer 以 cadre/module 的形式安装和自动加载。

或者,下载一个版本,或者克隆此存储库,然后将 Cadre\Module\ 命名空间映射到包的 src/ 目录。

依赖项

此包需要 PHP 7.0 或更高版本;已在 PHP 7.0 和 PHP 7.1 上进行测试。我们原则上推荐使用可用的最新 PHP 版本。

质量

Scrutinizer Code Quality Code Coverage Build Status

要在命令行中运行单元测试,请执行 composer install,然后在包根目录下执行 vendor/bin/phpunit。这需要 Composercomposer 的形式可用,以及 PHPUnitvendor/bin/phpunit 的形式可用。

此包试图遵守 PSR-1PSR-2PSR-4。如果您注意到遵守上的疏忽,请通过拉取请求发送补丁。

示例

$loader = new ModuleLoader([
    FirstModule::class,
    SecondModule::class,
], 'development', 'web');

$builder = new ContainerBuilder();
$di = $builder->newConfiguredInstance([$loader]);

$obj = $di->newInstance(ClassFromThirdModule::class);
use Aura\Di\Container;
use Cadre\Module\Module;

class FirstModule extends Module
{
    public function require()
    {
        if ($this->loader()->isContext('web')) {
            // Only require ThirdModule in the web context
            return [ThirdModule::class];
        } else {
            return [];
        }
    }

    public function define(Container $di)
    {
        $di->params[ClassFromFirstModule::class]['foo'] = 'bar';
    }
}

Cadre\Module\ModuleInterface

此接口扩展了 Aura\Di\ContainerConfigInterface 并定义了四个方法。

require()

返回它需要的其他模块的类名数组。

conflict()

返回它与冲突的其他模块的类名数组。

replace()

返回它替换的其他模块的类名数组。

Cadre\Module\Module

这是一个基类,您的模块可以扩展。它包含从 Cadre\Module\ModuleInterface 的所有方法的默认实现。

loader()

此方法仅在 Cadre\Module\Module 上定义,并返回相关的 Cadre\Module\ModuleLoaderInterface

这样,您可以根据其他模块的存在条件性地配置您的模块。

public function define(Container $di)
{
    if ($this->loader()->loaded(OtherModule::class)) {
        $di->set('service', $di->lazyNew(OtherService::class);
    } else {
        $di->set('service', $di->lazyNew(DefaultService::class);
    }
}

Cadre\Module\ModuleLoaderInterface

此接口扩展了 Aura\Di\ContainerConfigInterface 并定义了三个方法。

loaded($name)

如果指定名称的模块已被加载,则返回 true 或 false。

isEnv($environment)

如果 ModuleLoader 使用指定的环境实例化,则返回 true 或 false。

isContext($context)

如果 ModuleLoader 使用指定的上下文实例化,则返回 true 或 false。

Cadre\Module\ModuleLoader

此类执行所有工作。它包含从 Cadre\Module\ModuleInterface 中所有方法的默认实现。

__construct(array $modules, string $environment = '', string $context = '')

当你创建一个新的 ModuleLoader 时,你可以向其中传递你想要加载的模块。

你也可以指定正在运行的环境。当你指定环境时,我们将检查在该环境中需要模块的方法。例如,如果你的环境是 "dev",我们将寻找一个名为 requireDev 的方法。

为了生成方法名称,我们将蛇形命名(例如:special_environment)的环境转换为驼峰命名的方法名称,并以前缀 "require" 开头(例如:requireSpecialEnvironment)。

你也可以指定正在运行的上下文。默认情况下,我们不处理上下文。然而,你可以在模块内部通过加载器上的 isContext 方法查询它。例如,如果你的上下文是 "web",你可以像这样查询它:if ($this->loader()->isContext('web')) { } 并配置不同的内容。

protected resolveDependencies()

此方法从 loadeddefinemodify 中调用。

它从构造函数中的模块列表开始,遍历它们加载模块,然后向列表中添加 require 和可选的 require{Environment} 模块以加载。

如果加载了冲突的模块,则抛出 Cadre\Module\ConflictingModuleException。如果已替换的模块已被替换,则抛出 Cadre\Module\AlreadyReplacedException。如果已加载替换的模块,则抛出 Cadre\Module\AlreadyLoadedException

define(Container $di)

传递给所有已加载模块上的 define 方法。

modify(Container $di)

传递给所有已加载模块上的 modify 方法。