hhpack/service-locator

Hack的服务定位器

2.2.0 2019-04-15 03:09 UTC

README

Latest Stable Version CircleCI Dependency Status License

基本用法

实现服务创建工厂。

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