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

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

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

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

[siteroot] \. env:

APP_ENV=local

[siteroot] \ 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 работал без резервного значения в командном файле, может ли кто-нибудь помочь выполнить это?

1 Ответ

3 голосов
/ 09 июля 2020

Этот ответ состоит из нескольких частей.

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

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

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

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

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

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

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

Запуск 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').

...