hhpack / service-locator
Hack的服务定位器
2.2.0
2019-04-15 03:09 UTC
Requires
- hhvm: >=3.21.0
- hhpack/package: ^1.4
- hhvm/hhvm-autoload: ^2.0
Requires (Dev)
- facebook/fbexpect: ^2.5
- hhvm/hacktest: ^1.5
This package is auto-updated.
Last update: 2024-09-20 14:10:14 UTC
README
基本用法
实现服务创建工厂。
use HHPack\ServiceLocator\{ Service, ServiceFactory, Locator }; interface Logger implements Service { } final class LoggerService implements Logger { } final class LoggerFactory implements ServiceFactory { const type T = Logger; public function createService(Locator $locator): this::T { return new LoggerService(); } }
指定 ServiceFactory,以创建服务定位器。
use HHPack\ServiceLocator\ServiceLocator; $locator = ServiceLocator::fromItems([ new LoggerFactory() ]); $logger = $locator->lookup(Logger::class);
服务工厂模块
通过使用提供 ServiceFactory 的模块,您可以生成新的服务定位器。
use HHPack\ServiceLocator\{ ServiceFactory, Module }; final class CustomModule implements Module { public function getIterator() : Iterator<ServiceFactory> { yield new LoggerFactory(); } }
使用定义的模块,生成新的服务定位器。
use HHPack\ServiceLocator\ServiceLocator; $locator = ServiceLocator::fromModule(new CustomModule()); $logger = $locator->lookup(Logger::class); $logger->put('logger loaded');
环境模块
通过使用 EnvironmentModule,您将能够根据 HHVM_ENV 的设置加载模块。
当 HHVM_ENV 是 production 时,从指定的目录中查找名为 Production 的模块。
use HHPack\ServiceLocator\ServiceLocator; use HHPack\ServiceLocator\Module\EnvironmentModule; $module = new EnvironmentModule([ Pair { 'HHPack\\Service\\Example\\', __DIR__ } // autoload for module ]); $locator = ServiceLocator::fromModule($module); $logger = $locator->lookup(Logger::class); $logger->put('logger loaded');
通过执行示例中的 environment.hack,可以确认这一点。
-
开发
$ HHVM_ENV=development hhvm example/environment.hack $ development - logger loaded
-
生产
$ HHVM_ENV=production hhvm example/environment.hack $ production - logger loaded
运行测试
您可以使用以下命令运行测试。
composer install
composer test