项目作者: lamoda

项目描述 :
Library that provides classes to work with envs in multitenant environment
高级语言: PHP
项目地址: git://github.com/lamoda/multi-env.git
创建时间: 2019-03-05T08:57:14Z
项目社区:https://github.com/lamoda/multi-env

开源协议:MIT License

下载


Lamoda multi-env

Build Status
Scrutinizer Code Quality
Code Coverage
Build Status

Library that provides classes to work with envs in multitenant environment

Library based on params passed to it on initialization stage will decide which env variable should be used
for current request.

Installation

  1. Install library with composer:
    1. composer require lamoda/multi-env

Usage

Library usage examples to work in not multitenant environment (could be useful in development mode)

  1. <?php
  2. use \Lamoda\MultiEnv\Strategy\RawEnvResolvingStrategy;
  3. use \Lamoda\MultiEnv\Decorator\EnvProviderDecorator;
  4. // RawEnvResolvingStrategy - just wrap native PHP get_env function call
  5. $strategy = new RawEnvResolvingStrategy();
  6. EnvProviderDecorator::init($strategy);
  7. // Will be search original TEST_ENV env variable
  8. EnvProviderDecorator::getEnv('TEST_ENV');

Library usage examples to work in multitenant environment

  1. <?php
  2. use \Lamoda\MultiEnv\Strategy\HostBasedEnvResolvingStrategy;
  3. use \Lamoda\MultiEnv\Strategy\FileBasedEnvResolvingStrategy;
  4. use \Lamoda\MultiEnv\Decorator\EnvProviderDecorator;
  5. /*
  6. * Pass as first param one of available HostDetectorInterface implementations
  7. * Pass as second param one of available EnvNameFormatterInterface implementations
  8. */
  9. $strategy = new HostBasedEnvResolvingStrategy($hostDetector, $envFormatter);
  10. EnvProviderDecorator::init($strategy);
  11. /*
  12. * Will search env with some specific prefix/suffix resolved by HostDetectorInterface
  13. * For example host_id__TEST_ENV
  14. */
  15. EnvProviderDecorator::getEnv('TEST_ENV');
  16. /*
  17. * Pass as first param one of available HostDetectorInterface implementations which detect HostId for current request
  18. * Pass as second param one of available EnvFileReaderInterface (for now available only DotEnvV2FileReaderAdapter) which load specific env file
  19. * Pass as third param another EnvResolvingStrategy which find specific env variable from loaded envs
  20. */
  21. $strategy = new FileBasedEnvResolvingStrategy($hostDetector, $envFileReader, $envResolvingStrategy);
  22. EnvProviderDecorator::init($strategy);
  23. EnvProviderDecorator::getEnv('TEST_ENV');

Library set up by build in factory

  1. Library set up for work with env in file stored in different directories
    ```php
    <?php

use \Lamoda\MultiEnv\Builder\FileBasedEnvResolvingStrategyBuilder;
use \Lamoda\MultiEnv\Decorator\EnvProviderDecorator;

/*

  • Result strategy resolve hostId from server headers or cli args
  • Then load all envs from .env file stored by path /var/envs/hostId
  • Read TEST_ENV env variable
    */
    $strategy = FileBasedEnvResolvingStrategyBuilder::buildStrategy(‘HTTP_X_HOST_ID’, ‘host_id’, ‘.env’, ‘/var/envs’);
    EnvProviderDecorator::init($strategy);

EnvProviderDecorator::getEnv(‘TEST_ENV’);

  1. 2. Library set up for work with env with prefixes
  2. ```php
  3. <?php
  4. use \Lamoda\MultiEnv\Builder\HostBasedEnvResolvingStrategyBuilder;
  5. use \Lamoda\MultiEnv\Decorator\EnvProviderDecorator;
  6. /*
  7. * Result strategy resolve hostId from server headers or cli args
  8. * Add prefix to original env name. Result be like *hostId*___TEST_ENV
  9. * Replace all '-' char to '_' case '-' illegal in env variable name
  10. * Read *host_id*___TEST_ENV env variable
  11. */
  12. $strategy = HostBasedEnvResolvingStrategyBuilder::buildStrategy('HTTP_X_HOST_ID', 'host_id', '___');
  13. EnvProviderDecorator::init($strategy);
  14. EnvProviderDecorator::getEnv('TEST_ENV');

Library set up with multiple strategy

  1. <?php
  2. use \Lamoda\MultiEnv\Strategy\FirstSuccessfulEnvResolvingStrategy;
  3. use \Lamoda\MultiEnv\Strategy\RawEnvResolvingStrategy;
  4. use \Lamoda\MultiEnv\Strategy\HostBasedEnvResolvingStrategy;
  5. use \Lamoda\MultiEnv\HostDetector\FirstSuccessfulHostDetector;
  6. use \Lamoda\MultiEnv\HostDetector\CliArgsBasedHostDetector;
  7. use \Lamoda\MultiEnv\HostDetector\ServerHeadersBasedHostDetector;
  8. use \Lamoda\MultiEnv\Formatter\PrefixAppendFormatter;
  9. use \Lamoda\MultiEnv\HostDetector\Factory\GetOptAdapterFactory;
  10. use \Lamoda\MultiEnv\Decorator\EnvProviderDecorator;
  11. $rawEnvResolvingStrategy = new RawEnvResolvingStrategy();
  12. $hostBasedEnvResolvingStrategy = new HostBasedEnvResolvingStrategy(
  13. new FirstSuccessfulHostDetector([
  14. new ServerHeadersBasedHostDetector('HTTP_X_TEST_HEADER'),
  15. new CliArgsBasedHostDetector('host_id', GetOptAdapterFactory::build())
  16. ]),
  17. new PrefixAppendFormatter('___')
  18. );
  19. $firstSuccessfulStrategy = new FirstSuccessfulEnvResolvingStrategy([
  20. $rawEnvResolvingStrategy,
  21. $hostBasedEnvResolvingStrategy
  22. ]);
  23. EnvProviderDecorator::init($firstSuccessfulStrategy);
  24. /*
  25. * Try find original env 'TEST_ENV' first.
  26. * If original env not found than try to find env with some specific prefix/suffix resolved by HostDetectorInterface.
  27. * For example host_id__TEST_ENV
  28. */
  29. EnvProviderDecorator::getEnv('TEST_ENV');

Available HostDetectorInterface implementations

  1. \Lamoda\MultiEnv\HostDetector\ServerHeadersBasedHostDetector - use to identificate host via HTTP request

    1. <?php
    2. use \Lamoda\MultiEnv\HostDetector\ServerHeadersBasedHostDetector;
    3. use \Lamoda\MultiEnv\HostDetector\Exception\HostDetectorException;
    4. /*
    5. * Search passed needle in $_SERVER header. Use found value to identify current host
    6. * Throw HostDetectorException when passed empty needle
    7. */
    8. $headerBasedHostDetector = new ServerHeadersBasedHostDetector('HTTP_X_SOME_HEADER');
    9. $hostId = $headerBasedHostDetector->getCurrentHost();
  2. \Lamoda\MultiEnv\HostDetector\CliArgsBasedHostDetector - use to identificate host via Cli script run

    1. <?php
    2. use \Lamoda\MultiEnv\HostDetector\CliArgsBasedHostDetector;
    3. use \Lamoda\MultiEnv\HostDetector\Factory\GetOptAdapterFactory;
    4. use \Lamoda\MultiEnv\HostDetector\Exception\HostDetectorException;
    5. /*
    6. * Search passed needle in CLI args. Use found value to identify current host
    7. * Throw HostDetectorException when passed empty needle
    8. */
    9. $cliArgsBasedHostDetector = new CliArgsBasedHostDetector('needle', GetOptAdapterFactory::build());
    10. $hostId = $cliArgsBasedHostDetector->getCurrentHost();
  3. \Lamoda\MultiEnv\HostDetector\FirstSuccessfulHostDetector - use to aggregate multiple HostDetector’s

    1. <?php
    2. use \Lamoda\MultiEnv\HostDetector\ServerHeadersBasedHostDetector;
    3. use \Lamoda\MultiEnv\HostDetector\CliArgsBasedHostDetector;
    4. use \Lamoda\MultiEnv\HostDetector\Factory\GetOptAdapterFactory;
    5. use \Lamoda\MultiEnv\HostDetector\FirstSuccessfulHostDetector;
    6. // Iterate through passed HostDetector's and return first not empty HostId
    7. $firstSuccessfulHostDetector = new FirstSuccessfulHostDetector([
    8. new CliArgsBasedHostDetector('some_host_id', GetOptAdapterFactory::build()),
    9. new ServerHeadersBasedHostDetector('HTTP_HOST_ID')
    10. ]);
    11. $hostId = $firstSuccessfulHostDetector->getCurrentHost();

Available FormatterInterface implementations

  1. \Lamoda\MultiEnv\Formatter\PrefixAppendFormatter - append prefix and delimiter to original string.
    Combine original string, delimiter,host id in order
    *host id*, *delimiter*, *original string*

    1. <?php
    2. use \Lamoda\MultiEnv\Formatter\PrefixAppendFormatter;
    3. use \Lamoda\MultiEnv\Model\HostId;
    4. use \Lamoda\MultiEnv\Formatter\Exception\FormatterException;
    5. $formatter = new PrefixAppendFormatter('__');
    6. // Throw FormatterException if passed empty originalName
    7. $formatterName = $formatter->formatName('originalEnvName', new HostId('test_host'));
  2. \Lamoda\MultiEnv\Formatter\SuffixAppendFormatter - append suffix and delimiter to original string.
    Combine original string, delimiter,host id in order
    *original string*, *delimiter*, *host id*

    1. <?php
    2. use \Lamoda\MultiEnv\Formatter\SuffixAppendFormatter;
    3. use \Lamoda\MultiEnv\Model\HostId;
    4. use \Lamoda\MultiEnv\Formatter\Exception\FormatterException;
    5. $formatter = new SuffixAppendFormatter('___');
    6. // Throw FormatterException if passed empty originalName
    7. $formattedName = $formatter->formatName('originalEnvName', new HostId('test_host'));
  3. \Lamoda\MultiEnv\Formatter\CharReplaceFormatter - act like str_replace in PHP. Could be useful to replace illegal
    char ‘-‘ to ‘_\’ when you access to env variable

    1. <?php
    2. use \Lamoda\MultiEnv\Formatter\CharReplaceFormatter;
    3. use \Lamoda\MultiEnv\Model\HostId;
    4. use \Lamoda\MultiEnv\Formatter\Exception\FormatterException;
    5. $formatter = new CharReplaceFormatter('-', '_');
    6. /*
    7. * Throw FormatterException if passed empty originalName
    8. * return 'original_env_name'
    9. */
    10. $formattedName = $formatter->formatName('original-env-name', new HostId('testHost'));
  4. \Lamoda\MultiEnv\Formatter\FormatterPipeline - aggregate few formatters. Iterate through them and apply each to original stirng

    1. <?php
    2. use \Lamoda\MultiEnv\Formatter\FormatterPipeline;
    3. use \Lamoda\MultiEnv\Formatter\SuffixAppendFormatter;
    4. use \Lamoda\MultiEnv\Formatter\CharReplaceFormatter;
    5. use \Lamoda\MultiEnv\Model\HostId;
    6. $formatter = new FormatterPipeline([
    7. new SuffixAppendFormatter('-'),
    8. new CharReplaceFormatter('-', '_')
    9. ]);
    10. // return 'originalEnvName_test_host_id'
    11. $formattedName = $formatter->formatName('originalEnvName', new HostId('test-host-id'));