Нормально ли использовать параметры из файла .env через $ _ENV? - PullRequest
3 голосов
/ 10 октября 2019

Нормально ли использовать параметры в вашем собственном коде из файла .env через переменную $ _ENV? Конечно, в контексте проекта, использующего Symfony 4.

У меня есть такой код:

//WebhookUrlBuilder.php
class WebhookUrlBuilder
{

    private RouterInterface $router;

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;
        if (PHP_SAPI === 'cli') {
            $this->router->getContext()->setHost($_ENV['HOST_URL'])->setScheme($_ENV['URL_SCHEME']);
        }
    }

    public function build(string $hash): string
    {
        return $this->router->generate(BotsController::WEBHOOK_URL_NAME, [
            'hash' => $hash
        ], UrlGeneratorInterface::ABSOLUTE_URL);
    }
}

Есть мнение, что использование переменной $ _ENV - это дурной вкус, и я должен поставить этипараметры через ParameterBag, например:

#services.yml
parameters:
    host: '%env(HOST_URL)'
    scheme: '%env(URL_SCHEME)'
//WebhookUrlBuilder.php
class WebhookUrlBuilder
{

    private RouterInterface $router;

    public function __construct(RouterInterface $router, ParameterBag $parameterBag)
    {
        $this->router = $router;
        if (PHP_SAPI === 'cli') {
            $this->router
                 ->getContext()
                 ->setHost($parameterBag->get('host'))
                 ->setScheme($parameterBag->get('scheme'));
        }
    }

    public function build(string $hash): string
    {
        return $this->router->generate(BotsController::WEBHOOK_URL_NAME, [
            'hash' => $hash
        ], UrlGeneratorInterface::ABSOLUTE_URL);
    }
}

Но я считаю, что это бесполезное дополнительное действие (копирование значений из переменных .env в paramteres в services.yml), которое не приносит никакой прибыли. Что ты думаешь?

1 Ответ

1 голос
/ 10 октября 2019

Лучше отделить код от переменных среды, это сделает ваш код более переносимым и тестируемым. Вы должны переписать contstructor из WebhookUrlBuilder следующим образом:

//WebhookUrlBuilder.php
class WebhookUrlBuilder
{

    private RouterInterface $router;

    public function __construct(RouterInterface $router, $host, $scheme)
    {
        $this->router = $router;
        if (PHP_SAPI === 'cli') {
            $this->router
                 ->getContext()
                 ->setHost($host)
                 ->setScheme($scheme);
        }
    }

    public function build(string $hash): string
    {
        return $this->router->generate(BotsController::WEBHOOK_URL_NAME, [
            'hash' => $hash
        ], UrlGeneratorInterface::ABSOLUTE_URL);
    }
}

и ввести $host и $scheme через services.yaml следующим образом:

#services.yml
parameters:
    host: '%env(HOST_URL)'
    scheme: '%env(URL_SCHEME)'
services:
    WebhookUrlBuilder:
        autowire: true
        arguments: ['%host%', '%scheme%']

Теперь, благодаря autowireваш конструктор правильно создан, и вы можете создавать новые экземпляры, передавая напрямую $host и $scheme за пример в тесте phpunit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...