Переменные среды Laravel: неопределенный индекс для массива

У меня есть следующие настройки с Laravel 4.2:

самозагрузки / start.php (имя хоста правильное, среда местный)

$env = $app->detectEnvironment(array(
'production' => array('produrl'),
'local' => array('MBP-Ivo.local', 'iMac-Ivo.local'),
));

.env.local.php (в корне проекта .env.php точно такой же, кроме информации mysql)

<?php
return [
// Code variables
'mysqlUsername'     => 'user',
'mysqlPassword'     => 'password',
'mysqlDatabase'     => 'database',

'paymentIdeal' => false,

'shipmentCountries' => [
'Nederland' => 'Nederland',
'Belgie' => 'Belgie'
]
];

конфиг / app.php (Я не перезаписываю с app / config / local / app.php)

<?php

return array(
'paymentIdeal' => $_ENV['paymentIdeal'],
'shipmentCountries' => $_ENV['shipmentCountries']
);

Есть еще несколько переменных, но проблема в shipmentCountries.

Неопределенный индекс: shipmentCountries

Все объявленные переменные работают (например, paymentIdeal), но shipmentCountries выдает ошибку. Я думаю, потому что это массив? Имя везде одинаковое, включая заглавные буквы.

Кто-нибудь знает, почему я не могу заставить это работать?

Кстати: я выбираю эту опцию, чтобы пользователи не могли менять свои приложения. Я хочу использовать только один * .env файл для настройки всех важных вещей. И да, я знаю, что эти значения могут быть сохранены в базе данных, но это на будущее 🙂

/редактировать:
Когда я сбрасываю $ _ENV, я получаю следующее:

Array
(
[mysqlUsername] => ***
[mysqlPassword] => ***
[mysqlDatabase] => ***
[paymentIdeal] =>
[shipmentCountries.Nederland] => Nederland
[shipmentCountries.Belgie] => Belgie
);

Каким-то образом это «сплющивает» массив shipmentCountries. Кто-нибудь знает, как и почему?

2

Решение

Вы правы, файл получает преобразован в плоский массив с использованием точечной нотации (с array_dot)

Я полагаю, что причина этого в том, что переменные окружения просто не должны быть массивами, поскольку они обычно передаются при использовании CLI.

Итак, что вы можете с этим поделать?

Преобразовать массив из точки в не точку

В вашем app/start/global.php используйте этот код, чтобы преобразовать массив обратно в его исходный формат:

$array = array();
foreach ($_ENV as $key => $value) {
array_set($array, $key, $value);
}
$_ENV = $array;

Используйте другой файл и загрузите его самостоятельно

Также внутри app/start/global.php (это было бы .my.env.local.php)

$config = require base_path().'/.my.env.'.app()->env.'.php';
$_ENV = array_merge($_ENV, $config);

Sidenotes

Я подумал бы еще раз, если вы действительно не хотите использовать конфигурационные файлы. Можно иметь свой собственный конфигурационный файл и, возможно, вы даже можете поместить его в корневой каталог проекта.

Также я бы изменил массив на числовой:

'shipmentCountries' => [
'Nederland',
'Belgie'
]
1

Другие решения

С наконечником lukasgeiter я снова отправился на поиски и обнаружил:

https://github.com/laravel/framework/issues/5291 а также https://github.com/laravel/framework/pull/4623

Похоже, что Laravel не поддерживает эту опцию.

Теперь я сохраняю ее как строку JSON и декодирую, когда это необходимо.

0

Другой способ — json_encode вашего ассоциативного массива в env.local.php, затем в вашей конфигурации

json_decode($_ENV['shipmentCountries'],true);

Не забывайте логический аргумент, чтобы преобразовать его в массивы.

0
По вопросам рекламы [email protected]