在控制器中获取环境变量值

111

在我的.env文件中,我有以下内容:

IMAP_HOSTNAME_TEST=imap.gmail.com
IMAP_USERNAME_TEST=myemail@gmail.com
IMAP_PASSWORD_TEST=mypw
现在我想在我的控制器中使用它们。我尝试了这个,但没有任何结果:
$hostname = config('IMAP_HOSTNAME_TEST');

$hostname变量等于null。我如何在控制器中使用这些配置变量?


1
可能是Laravel 4:如何获取环境值?的重复问题。 - Narendrasingh Sisodia
15个回答

117

试着使用:

<?php $hostname = env("IMAP_HOSTNAME_TEST", "somedefaultvalue"); ?>

somedefaultvalue 可以是任何默认值,以防 env 不存在。 - Chetan Ameta
10
使用env()可能会导致意外问题,请参考Grant在此问题上的回答-https://dev59.com/dVsX5IYBdhLWcg3wFsEa#54286878。 - Steve
3
不适用于Laravel 5.5。请向下查找Masum Ahmed Sarkar的答案。 - Hari Harker
在Laravel 8^的config/app.php文件中添加以下简化形式,它就可以工作了。 'hostname' = env('IMAP_HOSTNAME_TEST'); - Steven

95

如果你想像下面这样从控制器中尝试访问值,它在 Laravel 5.3+ 中将无法工作。它始终返回 null。

<?php

    $value = env('MY_VALUE', 'default_value');

SOLUTION: 相反,您需要在配置文件夹中创建一个名为values.php的文件,然后编写以下代码

文件values.php

<?php

    return [

        'myvalue' => env('MY_VALUE',null),

        // Add other values as you wish

然后使用以下代码在您的控制器中访问该值

<?php

    $value = \Config::get('values.myvalue')

“values”是文件名,后面跟着关键字“myvalue”。


9
不确定为什么这个回答被投票否决了……它大部分是正确的L5.3+。但如果使用您的示例文件名 values.php,则在控制器中实际引用它的方式是 $value = config('values.myvalue'); - Drew Hammond
11
不要忘记运行 php artisan config:cache 命令来提交配置更改。 - Grant

88
简化一下:只有配置文件可以访问环境变量,然后将其传递给其他组件。 步骤1.) 将您的变量添加到.env文件中,例如:
EXAMPLE_URL="http://google.com"

步骤二.)config文件夹内创建一个新文件,可以随意命名,例如,

config/example.php

第三步:在这个新文件里,我添加了一个返回数组,包含该环境变量。

<?php
return [
  'url' => env('EXAMPLE_URL')
];

步骤 4.) 因为我将其命名为“example”,所以我的配置“命名空间”现在是 example。因此,在我的控制器中,我可以使用以下代码访问此变量:

$url = \config('example.url');

提示 - 如果在控制器顶部添加 use Config;,则无需使用反斜杠(表示根命名空间)。例如:

namespace App\Http\Controllers;
use Config; // Added this line

class ExampleController extends Controller
{
    public function url() {
        return config('example.url');
    }
}

最后,提交更改:

php artisan config:cache

--- 重要 --- 在创建example.php文件后,请记得在控制台中输入php artisan config:cache。配置文件和变量会被缓存,因此如果您进行更改,需要清除缓存 - 同样适用于更改/添加.env文件。


php artisan config:cache 会导致我的应用程序崩溃。 - Felipe Castillo
1
@FelipeCastillo 意味着您的应用程序在配置方面存在问题 - 因为该命令仅清除缓存。 - Grant
2
config() 是一个辅助函数,不需要使用 use Config;。通过使用 use 语句,您可以为 Illuminate\Support\Facades\Config::class 使用别名 Config,例如:Config::get('example.url') - Ametad
1
@petermortensen @Grant,这是一个很好的答案。我的问题是为什么这个方法有效,而不是只使用Laravel的env()辅助方法? - CodeConnoisseur
1
@PA-GW env() 助手仅访问存储在 .env 文件中的(通常是安全敏感的)环境变量。你会注意到,在我的开头行中,我提到似乎(至少截至回答这个问题的日期),配置文件是唯一能够访问这些敏感超级全局变量的文件。 - Grant

32

当您的应用程序收到请求时,.env文件中列出的所有变量都将加载到$_ENV PHP超全局变量中。查看Laravel配置页面

$_ENV['yourkeyhere'];

1
这是如何从.env文件中获取值的正确和最佳答案。 - endo64
Laravel 9控制器中对我无效。 - Artur Müller Romanov

6
你可以使用这个格式(在Laravel 5.5上测试过)。我的情况是我用它来获取数据库连接的数据并在控制器上使用:
$User = env('DB_USERNAMEchild','');
$Pass = env('DB_PASSWORDchild','');

第二个参数可以为 null,在 DB_USERNAMEchild 为空的情况下设置默认值。

您的 .env 文件可以保持不变:

DB_HOST=localhost
DB_DATABASE=FATHERBD
DB_USERNAME=root
DB_PASSWORD=password

DB_DATABASEchild=ZTEST
DB_USERNAMEchild=root
DB_PASSWORDchild=passwordofchild

1
你把这段代码放在哪里了,是 config/app.php 还是控制器/视图中?这在 Laravel 5.2 上对我有效,但在 Laravel 5.3+ 上似乎不行。既然你指定了 Laravel 5.5,那么我一定做错了什么? - Wouter Vanherck
我已将此代码放置在 app/Http/ExampleController.php 文件中。 - Zarkys Salas

5

将配置变量放入配置文件是一个更好的主意。

在您的情况下,我建议将变量放入 config/mail.php 文件中,例如:

'imap_hostname' => env('IMAP_HOSTNAME_TEST', 'imap.gmail.com')

参考它们的方法是

config('mail.imap_hostname')

它首先尝试获取位于.env文件中的配置变量值,如果在.env文件中找不到该变量值,则会从文件config/mail.php中获取变量值。

3

Laravel 5.2 版本之后,被接受的答案不再有效:

要在控制器或 Laravel 项目中的任何 PHP 文件中获取环境值,您有两种情况:

情况 1(预定义键):如果您需要从 Laravel 项目创建的 .env 文件或已安装并按照正确的安装程序进行了设置的第三方插件中获取值,请参见此答案进行解释:https://dev59.com/HFgQ5IYBdhLWcg3wJgiO#69707775

情况 2(非预定义键 - 如果您需要生成新的自定义环境键):请按照以下说明操作:

1- 在 .env 文件中添加您的自定义键。例如,我将添加此键:

UNIFONIC_APP_ID=xx2Erdasd7Ik7XfdesfaV9HX47

2- 在 laravel_root/config 文件夹中添加一个新的 php 文件,例如我将添加这个文件 config/custom.php ,其内容如下:

return [

    'unifonic_id' => env('UNIFONIC_APP_ID' , 'Here Default value will used of UNIFONIC_APP_ID not defined in .env file'),

];

3- 在终端中运行以下两个命令:

php artisan config:clear
php artisan config:cache

4 - 现在,在任何php文件(控制器,模型,视图等)中,您都可以调用此函数:

config('custom.unifonic_id');

其中custom是在步骤2中生成的php文件的名称,unifonic_id是在步骤2中定义的数组的键。

如果在.env中定义了UNIFONIC_APP_ID,则会返回该值,否则将返回在配置文件步骤2中定义的默认值。

注意1:配置文件可以返回多维数组,请查看位于laravel_root/config文件夹中的配置文件结构。

注意2:您可以修改文件laravel_root/config/services.php而不是创建新的配置文件...


3

正如@Rajib指出的,您无法使用config('myVariable')来访问您的环境变量。

  1. 首先您需要将该变量添加到.env文件中。
  2. 将该变量添加到config目录中的某个配置文件中。我通常会添加到config/app.php文件中。
  3. 完成后,可以使用Config Facade来访问它们,例如:Config::get('fileWhichContainsVariable.Variable');

可能需要使用php artisan config:clear清除配置缓存,并且您还需要重启服务器。


3
您可以将该值添加到您的 .env 文件中。
 VALUE=somevalue
on the controller 
$_ENV['VALUE']
or
env('VALUE')

如果它不能正常工作,运行这个命令。

php artisan config:clear

2

在控制器中

$hostname = $_ENV['IMAP_HOSTNAME_TEST']; (or) $hostname = env('IMAP_HOSTNAME_TEST');

在 blade.view 中

{{$_ENV['IMAP_HOSTNAME_TEST']}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接