Переменные среды Laravel (без значения по умолчанию, переданного в методе) не работают внутри командного файла Artisan

Я использую Laravel 6.x для клиентского проекта, в котором я создал API в Artisan Command для синхронизации данных.

Теперь клиент хочет, чтобы конфигурация была незаметной, вне основного исходного кода и без каких-либо резервных значений, насколько это возможно. Это означает, что я должен определить конфигурации в файле .env и использовать метод env() без каких-либо резервных значений по умолчанию.

Это должно быть возможно внутри файлов командных классов Laravel Artisan, но это не работает должным образом, когда я использую метод env в коде, как показано ниже:

[siteroot] \. env:

APP_ENV=local

[siteeroot] \ app \ Console \ Commands \ SyncSomeData.php:

use Illuminate\Console\Command;

class SyncSomeData extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sync:some-data';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        exit(env('APP_ENV','staging1'));
    }
}

Это всегда печатает staging1 в консоли, и если я использую это вместо данного метода env, он ничего не печатает:

exit(env('APP_ENV'));

Насколько я знаю и могу доверять, что Laravel наиболее безопасен, должен быть способ, чтобы метод env работал без резервного значения в командном файле, может ли кто-нибудь помочь в этом?


person Vicky Dev    schedule 09.07.2020    source источник
comment
Не могли бы вы попробовать config ('app.env'), пожалуйста? И сначала запустить php artisan config: cache? Я верю в новые версии laravel, это рекомендуемый подход, я не думаю, что вы можете получить доступ к env (), как раньше.   -  person Kurt Friars    schedule 09.07.2020
comment
Вау, это действительно сработало, хотя этого и не ожидалось. Не могли бы вы отформатировать это в ответ, добавив дополнительную информацию и ссылки для поиска, а также причину, по которой нам нужно config вместо env? Потому что другие ссылки SO недостаточно хороши, чтобы дать хорошее руководство по этой конкретной теме ... Цените это ...   -  person Vicky Dev    schedule 09.07.2020
comment
Мой комментарий не совсем правильный, но я подозревал, что это проблема. Я постараюсь дать ответ ниже.   -  person Kurt Friars    schedule 09.07.2020
comment
Также как насчет того, если я определил свои пользовательские env переменные, такие как API_SOAP_URL, как мне их распечатать. Я только что пробовал использовать config('api.soap.url'), но напечатано пустое ... Так что, пожалуйста, включите это в свой ответ, спасибо ... Сейчас я очищаю кеш каждый раз, когда меняю файл .env, так что в основном это не проблема ...   -  person Vicky Dev    schedule 09.07.2020
comment
Дайте мне знать, если в моем ответе что-то упущено. Ваш последний комментарий, вероятно, связан с тем, что php artisan config: cache не запущен после добавления или изменения значения.   -  person Kurt Friars    schedule 09.07.2020
comment
Хорошо, позвольте мне прояснить пару вещей. После того, как я прочитал ваш ответ, который, на мой взгляд, очень информативен, я внимательно изучил сценарий config:cache, и он синхронизируется с файлом .env. Знаете что, он вообще не кэширует какие-либо объявленные пользователем переменные конфигурации, такие как API_SOAP_URL. Я видел файл кеша, и в нем перечислены только APP. переменные конфигурации, поэтому главный вопрос: как мне поручить / заставить Laravel кэшировать любую настраиваемую переменную / значение, указанную в .env вместе с запуском php artisan config:cache, а также, если необходимо, php artisan config:clear?   -  person Vicky Dev    schedule 09.07.2020
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Vicky Dev    schedule 09.07.2020


Ответы (1)


Этот ответ состоит из пары частей.

  1. Конфигурация кеширования

Проблема в этом вопросе присутствует только в том случае, если вы кэшировали свою конфигурацию в своей локальной среде. Если вы когда-либо запускали php artisan config:cache или php artisan optimize, значит, вы кэшировали свой config.

В результате laravel больше не будет читать ваш файл .env и загружать все значения для config и .env из кеша.

Лучше всего не использовать env () во всем приложении, а создать файлы конфигурации для этих значений. Это ускорит работу вашего приложения в рабочей среде. Если вы хотите воспользоваться кешем конфигурации, вы НЕ МОЖЕТЕ использовать env () где угодно, кроме ваших файлов конфигурации.

В вашей локальной среде документация рекомендует не кэшировать конфигурацию, так как она будет часто обновляться. Я думаю, что это хороший совет с одной оговоркой: env (). Если вы не кешируете свою конфигурацию на локальном компьютере, но находитесь в продакшене, вы не столкнетесь с ошибками, подобными той, которая послужила толчком для этого сообщения на локальном уровне. Если у вас есть ci-конвейер и хорошая практика тестирования, это препятствие будет преодолено.

Если вы придерживаетесь локальной конфигурации кеша, каждый раз, когда вы обновляете файлы конфигурации или файл .env, вам нужно будет запускать php artisan config:cache.

  1. Отключение кеша конфигурации

При запуске php artisan config:clear или удалении /bootstrap/cache/config.php laravel больше не будет пытаться читать конфигурацию из кеша, и .env будет работать вне файлов конфигурации. Если вы сделаете это, как я сказал в (1), убедитесь, что есть часть вашего конвейера, которая будет перехватывать эти ошибки, если вы кэшируете конфигурацию в производственной среде.

После дальнейшего обсуждения с OP я проясню еще одну вещь:

Конфигурация кеширования не просто автоматически кэширует ваши ключи .env, поэтому вы можете получить к ним доступ, как config ('SOME_CUSTOM_DOT_ENV_KEY'). При использовании конфигурации кеша, если вам нужно получить доступ к переменным среды внутри вашего приложения, вы должны указать на них ссылку в файле конфигурации.

Опять же, как только кеш конфигурации включен, .env становится бесполезным, но он используется для создания кеша.

Итак, если вы в .env скажете:

GOOGLE_API_TOKEN=xxxx

Возможно, вы создадите файл конфигурации, например:

google.php

return [
    'api_token' => env('GOOGLE_API_TOKEN', 'some-default-value'),
];

И в своем приложении вы будете ссылаться только на config ('google.api_token') и никогда не будете ссылаться на env ('GOOGLE_API_TOKEN').

person Kurt Friars    schedule 09.07.2020
comment
Очень красивое объяснение - person sta; 09.07.2020