У меня есть следующие настройки с 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. Кто-нибудь знает, как и почему?
Вы правы, файл получает преобразован в плоский массив с использованием точечной нотации (с 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);
Я подумал бы еще раз, если вы действительно не хотите использовать конфигурационные файлы. Можно иметь свой собственный конфигурационный файл и, возможно, вы даже можете поместить его в корневой каталог проекта.
Также я бы изменил массив на числовой:
'shipmentCountries' => [
'Nederland',
'Belgie'
]
С наконечником lukasgeiter я снова отправился на поиски и обнаружил:
https://github.com/laravel/framework/issues/5291 а также https://github.com/laravel/framework/pull/4623
Похоже, что Laravel не поддерживает эту опцию.
Теперь я сохраняю ее как строку JSON и декодирую, когда это необходимо.
Другой способ — json_encode вашего ассоциативного массива в env.local.php, затем в вашей конфигурации
json_decode($_ENV['shipmentCountries'],true);
Не забывайте логический аргумент, чтобы преобразовать его в массивы.