Laravel环境变量:数组的未定义索引


Laravel environment variables: Undefined Index for array

我在Laravel 4.2中有以下设置:

引导/启动.php(主机名正确,环境是本地的)

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

env.local.php(在项目根目录中,.env.php 与 mysql info 完全相同)

<?php
    return [
        // Code variables
        'mysqlUsername'     => 'user',
        'mysqlPassword'     => 'password',
        'mysqlDatabase'     => 'database',
        'paymentIdeal' => false,
        'shipmentCountries' => [
                'Nederland' => 'Nederland',
                'Belgie' => 'Belgie'
        ]
];

config/app.php (我不会用app/config/local/app.php覆盖)

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

还有一些变数,但问题出在出货量上。

未定义索引:发货国家

声明的所有变量都有效(例如付款理想),但发货国家/地区给出错误。我想是因为它是一个数组?名称在任何地方都完全相同,包括大写字母。

有谁知道为什么我不能让它工作?

顺便说一句:我选择此选项是为了防止用户必须更改其应用程序配置。我只想使用一个 *.env 文件来配置所有重要的东西。是的,我知道这些值可以保存到数据库中,但那是以后:)

/编辑:当我抛售 _ENV 美元时,我得到以下内容:

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

不知何故,它"扁平化"了阵列发货国家。有人知道如何以及为什么吗?

你是

对的,文件使用点符号(带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 字符串,并在必要时对其进行解码。

另一种方法是在 env.local.php 中json_encode关联数组,然后在配置中

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

不要忘记那里的布尔参数,以使其转换为数组。