在Laravel 5中加载GOOGLE_APPLICATION_CREDENTIALS

5
我正在使用 Laravel 5.2,并按照官方文档的建议执行 php artisan config:cache 命令以提高速度。
正如您所知,此命令会使 .env 文件中的变量直接无法访问(您可以使用 php artisan tinker 进行测试),因此除了 config 文件夹中的文件之外,所有对 env()getenv() 函数的调用都必须在代码中替换为 config()。执行此命令后,像 env('APP_ENV') 这样的调用将返回 NULL。
在我的项目中,我使用 google-auth-library-php 连接到 Google Cloud。不幸的是,在 CredentialsLoader.php 文件中有一个调用函数 getenv(self::ENV_VAR),试图获取 Google 凭据文件的路径。由于我运行了 php artisan config:cache 命令,因此无法从 .env 文件中读取该路径,导致连接无法完成。
我看到有三种方法可以继续:
  1. 忘记运行 php artisan config:cache
  2. 在此询问是否有人知道如何将 Google 凭据文件的路径指定为包中任何函数的参数。
  3. (请原谅我,上帝)更正 CredentialsLoader.php 文件(将 getenv() 更改为 config()),运行命令并在存储库中跟踪此文件,然后当团队成员拉取时,此更改将传播到每个人。
提前感谢您!

CredentialsLoader::fromEnv 从环境中加载。最好在 CredentialsLoader 上使用另一种方法,或者手动使用配置中的设置创建凭据。 - sisve
嗨!现在已经过去3年了... :) 你的解决方案是什么? - Lorenzo S
实际上,我是使用特定的配置完成的... Nginx + PHP with FastCGI。我会回答这个问题,因为也许对于将来再次访问这个问题的人有所帮助。 - Lorenzo S
2个回答

1

对于那些仍然遇到这个错误的人,你可以在第一个参数中使用 keyFile 索引指定文件:

$storage = new StorageClient([
   'keyFile' => json_decode(file_get_contents($path), true),
]);

或者您可以直接使用 keyFilePath 索引将 .json 文件指定为配置文件。

$storage = new StorageClient([
   'keyFilePath' => '/path/to/json/CompanyDataStorage-foobarbaz.json',
]);

0

这是一个非常古老的问题,但可能对于在Laravel的新版本中遇到相同问题的人们有用。 基本上我没有一个适用于所有可能环境的解决方案,但它提供了思路。 我的环境运行php7.4-fpmNGINX。 如果您使用相同的环境,则会为您的php文件设置location指令。 Nginx可以使用fastcgi_param设置FastCGI参数,您可能已经使用它来使用SCRIPT_FILENAME等. 然后您可以添加

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    [...]
    fastcgi_param GOOGLE_APPLICATION_CREDENTIALS "/absolute/path/to/keyfile.json";
}

然后只需重新加载Nginx(例如,对于Ubuntu 20.04,sudo systemctl reload nginx)。

对于Apache来说,同样的想法可能可以使用SetEnvhttps://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv实现。


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