【问题标题】:Laravel environment variables: Undefined Index for arrayLaravel 环境变量:数组的未定义索引
【发布时间】:2015-02-26 10:45:56
【问题描述】:

我在 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

未定义索引:shippingCountries

声明的所有变量都在工作(例如 paymentIdeal),但 shippingCountries 给出错误。我想是因为它是一个数组?名称在任何地方都完全相同,包括大写字母。

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

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

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

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

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

【问题讨论】:

  • var_dump$_ENV 显示什么?
  • 见上文,它以某种方式“压平”了数组?但是为什么...?

标签: php laravel laravel-4 environment-variables


【解决方案1】:

你是对的,文件 get 使用点符号(使用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'
]

【讨论】:

    【解决方案2】:

    借助lukasgeiter的提示,我又去搜索了一遍,发现了这个:

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

    Laravel 好像不支持这个选项。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-27
        • 2020-07-22
        • 2020-08-09
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多