Невозможно получить доступ к переменным dotenv из службы Symfony - PullRequest
0 голосов
/ 20 июня 2019

Использование:

        "php": "^7.1.3",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "doctrine/doctrine-bundle": "^1.11",
        "doctrine/doctrine-fixtures-bundle": "^3.1",
        "doctrine/doctrine-migrations-bundle": "^2.0",
        "doctrine/orm": "^2.6",
        "friendsofsymfony/oauth-server-bundle": "^1.6",
        "friendsofsymfony/rest-bundle": "^2.5",
        "friendsofsymfony/user-bundle": "^2.1",
        "jms/serializer-bundle": "^3.3",
        "nelmio/api-doc-bundle": "^3.4",
        "nelmio/cors-bundle": "^1.5",
        "symfony/console": "4.2.*",
        "symfony/debug": "4.2.*",
        "symfony/dotenv": "4.2.*",
        "symfony/event-dispatcher": "4.2.*",
        "symfony/flex": "^1.1",
        "symfony/framework-bundle": "4.2.*",
        "symfony/http-foundation": "4.2.*",
        "symfony/http-kernel": "4.2.*",
        "symfony/maker-bundle": "^1.11",
        "symfony/monolog-bundle": "^3.3",
        "symfony/orm-pack": "^1.0",
        "symfony/routing": "4.2.*",
        "symfony/swiftmailer-bundle": "^3.2",
        "symfony/translation": "4.2.*",
        "symfony/yaml": "4.2.*"

Я не могу получить доступ к значениям из моих файлов .env и .env.local из службы Symfony. Я получаю сообщение об ошибке «Уведомление: неопределенный индекс».

Я вижу, что приложение загружает .env и .env.local из config / bootstrap.php

(new Dotenv(false))->loadEnv(dirname(__DIR__).'/.env', dirname(__DIR__).'/.env.local');

Я также проверил следующие файлы, чтобы выяснить, есть ли что-то связанное с dotenv, и ничего не нашел

  • публичный / index.php
  • Web / app_dev.php
  • Web / app.php
  • config / packages / framework.yaml

Вот как я пытаюсь получить доступ к переменной:

<?php

namespace App\Manager\Studio;

use ...

class StudioManager
{
    protected $em;

    private $logger;

    public function __construct(
        EntityManagerInterface $em,
        LoggerInterface $logger
    ) {
        parent::__construct($logger, $translator);

        $this->em              = $em;
        $this->logger          = $logger;

    }

    public function createOneFromRequest(CustomRequest $request)
    {
        $this->logger->critical($_ENV['CORS_ALLOW_ORIGIN']);

    }

    public function getAllFromRequest()
    {
        return $this->getEntities(Studio::class);
    }

}

И вот что я вижу в своем журнале:

request.CRITICAL: Uncaught PHP Exception ErrorException: "Notice: Undefined index: CORS_ALLOW_ORIGIN"...

Обновление (согласно комментариям Ugo ниже):

Если я добавлю следующее в мой config / services.yaml

    App\Manager\Studio\StudioManager:
        arguments:
            - '%env(GOOGLE_GEOCODE_URL)%'
            - '%env(GOOGLE_GEOCODE_KEY)%'

и обновите мой сервис:

class StudioManager extends AbstractRestManager
{
    protected $em;

    private $logger;
    private $translator;
    private $google_geocode_url;
    private $google_geocode_key;

    public function __construct(
        EntityManagerInterface $em,
        LoggerInterface $logger,
        TranslatorInterface $translator,
        string $google_geocode_url,
        string $google_geocode_key
    ) {
        parent::__construct($logger, $translator);

        $this->em                 = $em;
        $this->logger             = $logger;
        $this->translator         = $translator;
        $this->google_geocode_url = $google_geocode_url;
        $this->google_geocode_key = $google_geocode_key;

    }

Я получаю следующую ошибку:

Cannot autowire service App\Manager\Studio\StudioManager: argument $google_geocode_url of method __construct() is type-hinted stringyou should configure its value explicitly

Так что если я сделаю так, как подсказывает ошибка:

    App\Manager\Studio\StudioManager:
        arguments:
            $google_geocode_url: '%env(GOOGLE_GEOCODE_URL)%'
            $google_geocode_key: '%env(GOOGLE_GEOCODE_KEY)%'

Я получаю другую ошибку:

"message": "Environment variable not found: \"GOOGLE_GEOCODE_URL\"

Также, если я запускаю php bin / console about, я вижу переменные, перечисленные в разделе Environment (.env).

Кажется, я хожу по кругу

1 Ответ

0 голосов
/ 20 июня 2019

Вы можете передать это env var в декларации сервиса следующим образом:

App\Manager\Studio:
    arguments:
        ... other args
        - '%env(CORS_ALLOW_ORIGIN)%'

// Studio class
....

public function __construct(
        EntityManagerInterface $em,
        LoggerInterface $logger,
        string $dotEnvVar
    ) {
        parent::__construct($logger, $translator);

        $this->em              = $em;
        $this->logger          = $logger;
        $this->dotEnvVar       = $dotEnvVar;

    }

    public function createOneFromRequest(CustomRequest $request)
    {
        $this->logger->critical($this->dotEnvVar);

    }
    ....

или

App\Manager\Studio:
        calls:
        - method: setYourDotEnvVar
          arguments:
              - '%env(CORS_ALLOW_ORIGIN)%'

// Studio class

public function setYourDotEnvVar(string $dotEnvVar)
{
    $this->dotEnvVar = $dotEnvVar;  
}
...