EnvironmentConfigSource.php 1.95 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Config\App\Config\Source;

use Magento\Framework\App\Config\ConfigSourceInterface;
use Magento\Framework\DataObject;
use Magento\Config\Model\Placeholder\PlaceholderFactory;
use Magento\Config\Model\Placeholder\PlaceholderInterface;
use Magento\Framework\Stdlib\ArrayManager;

/**
 * Class for retrieving configurations from environment variables.
 *
 * @api
 * @since 101.0.0
 */
class EnvironmentConfigSource implements ConfigSourceInterface
{
    /**
     * Library for working with arrays.
     *
     * @var ArrayManager
     */
    private $arrayManager;

    /**
     * Object for working with placeholders for environment variables.
     *
     * @var PlaceholderInterface
     */
    private $placeholder;

    /**
     * @param ArrayManager $arrayManager
     * @param PlaceholderFactory $placeholderFactory
     */
    public function __construct(
        ArrayManager $arrayManager,
        PlaceholderFactory $placeholderFactory
    ) {
        $this->arrayManager = $arrayManager;
        $this->placeholder = $placeholderFactory->create(PlaceholderFactory::TYPE_ENVIRONMENT);
    }

    /**
     * @inheritdoc
     * @since 101.0.0
     */
    public function get($path = '')
    {
        $data = new DataObject($this->loadConfig());
        return $data->getData($path) ?: [];
    }

    /**
     * Loads config from environment variables.
     *
     * @return array
     */
    private function loadConfig()
    {
        $config = [];

        $environmentVariables = $_ENV;

        foreach ($environmentVariables as $template => $value) {
            if (!$this->placeholder->isApplicable($template)) {
                continue;
            }

            $config = $this->arrayManager->set(
                $this->placeholder->restore($template),
                $config,
                $value
            );
        }

        return $config;
    }
}