cadre / module
基于 Aura.Di 的模块系统
Requires
- php: ^7.0
- aura/di: ^3.0
Requires (Dev)
- pds/skeleton: 1.x-dev
- phing/phing: ^2.15
- phpstan/phpstan: ^0.6.3
- phpunit/phpunit: ^6.0
- squizlabs/php_codesniffer: ^3.0@RC
README
这是一个基于 Aura.Di 的轻量级模块系统。
此库定义了几个类,这些类实现了 Aura\Di\ContainerConfigInterface
,因此它可以在使用 Aura.Di 的任何项目中使用。
由于此项目处于早期开发阶段,请通过 问题 提供反馈。
安装和自动加载
此包可通过 Composer 以 cadre/module 的形式安装和自动加载。
或者,下载一个版本,或者克隆此存储库,然后将 Cadre\Module\
命名空间映射到包的 src/
目录。
依赖项
此包需要 PHP 7.0 或更高版本;已在 PHP 7.0 和 PHP 7.1 上进行测试。我们原则上推荐使用可用的最新 PHP 版本。
质量
要在命令行中运行单元测试,请执行 composer install
,然后在包根目录下执行 vendor/bin/phpunit
。这需要 Composer 以 composer
的形式可用,以及 PHPUnit 以 vendor/bin/phpunit
的形式可用。
此包试图遵守 PSR-1、PSR-2 和 PSR-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()
此方法从 loaded
、define
和 modify
中调用。
它从构造函数中的模块列表开始,遍历它们加载模块,然后向列表中添加 require 和可选的 require{Environment} 模块以加载。
如果加载了冲突的模块,则抛出 Cadre\Module\ConflictingModuleException
。如果已替换的模块已被替换,则抛出 Cadre\Module\AlreadyReplacedException
。如果已加载替换的模块,则抛出 Cadre\Module\AlreadyLoadedException
。
define(Container $di)
传递给所有已加载模块上的 define
方法。
modify(Container $di)
传递给所有已加载模块上的 modify
方法。