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

时间:2014-12-30 09:17:17

标签: php laravel laravel-4 environment-variables

我在Laravel 4.2中进行了以下设置:

bootstrap / 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'
        ]
];

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

<?php

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

还有一些变量,但问题出在 shipmentCountries

  

未定义的索引:shipmentCountries

声明的所有变量都有效(例如paymentIdeal),但shipmentCountries给出错误。我想因为它是一个阵列?这个名字在各处都是一样的,包括大写字母。

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

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

/编辑: 当我转储$ _ENV时,我得到以下内容:

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

不知何故,它“扁平化”了数组货运国家。任何人都知道如何以及为什么?

3 个答案:

答案 0 :(得分:1)

你没错,使用点符号(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'
]

答案 1 :(得分:0)

随着lukasgeiter的提示,我再次搜索,发现了这个:

https://github.com/laravel/framework/issues/5291https://github.com/laravel/framework/pull/4623

看起来Laravel不支持此选项。

我现在所做的是将其保存为JSON字符串,并在需要时对其进行解码。

答案 2 :(得分:0)

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

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

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