【问题标题】:Problem of environment files with inter-apis calls laravel跨api调用laravel的环境文件问题
【发布时间】:2020-07-07 23:43:12
【问题描述】:

大家早上好,

作为演示API开发的一部分,我实现了两个API:

  • HelloWorld
  • 通知

第一个允许请求执行 HelloWorld,第二个允许根据定义的模板发送电子邮件。 在我的演示中,我从 Postman(或从 React 应用程序)对 HelloWorld 进行 API 调用,然后对 Notifier 进行 API 调用以发送消息。

如果我从 Postman 直接调用 Notifier API 来发送电子邮件,我不会遇到任何问题(.env 文件已很好地配置用于在此 API 中发送电子邮件)。 另一方面,如果我将我的 API 从 HelloWorld 调用到 Notifier(HelloWorld 的 .env 文件未配置为发送电子邮件),我会遇到错误:

预期的响应代码为 250,但得到代码“530”,消息为“530 5.7.1 需要认证

另一方面,如果我配置 HelloWorld API 的 .env 文件(它不会在任何时候发送电子邮件),我不会再有任何错误,并且通知程序可以很好地发送我的电子邮件。

这是 HelloWorld 中的 API 调用:

$client = new Client();

$response = $client->post("http://vhost-url.local/api/notifier/sendmail", [
    'json' => [
         'to' => $to,
         'template' => $template,
         'parameters' => $parameters
     ],
]);

这是 Notifier API 中调用的操作:

public function sendmail(Request $request)
{
    $params = json_decode($request->getContent(), true);

    try{
        switch ($params['template']) {
            case 'HELLO_WORLD':
                Mail::to($params['to'])
                    ->send(new HelloWorld([
                        'message' => $params['parameters']['message']
                    ]));
                break;
            default:
                throw new \Exception("Ce template n'existe pas");
                break;
        }
    } catch(\Exception $e) {
        return response()
            ->json([
                'message' => $e->getMessage(),
            ], 500);
    }

    return response()
        ->json([
            'message' => 'Le mail a bien été envoyé'
        ], 200);

}

我的问题是:在 API 调用期间(在我的情况下使用 Guzzle),是否使用源 API 的环境文件而不是目标 API 的环境文件?如果是这样,如何解决这个问题?

【问题讨论】:

    标签: php laravel api environment-variables guzzle


    【解决方案1】:

    我不确定这是否有帮助,但我也遇到过类似的问题。在交叉通信 Laravel 项目时,.env 文件会变得混乱(我相信仅在 Windows 上)。

    例如见https://github.com/laravel/framework/issues/19454

    解决方案是运行php artisan config:cache 来创建.env 变量的缓存版本。请注意,您永远不应该在代码中使用env('...'),而应该使用像config('app.env') 这样的配置文件来引用它们。 .env 变量因此不能是动态的。

    对于自定义环境变量,我通常会创建一个config/project.php 文件,如下所示:

    return [
       'my_custom_var' => env('PROJECT_MY_CUSTOM_VAR')
    ];
    

    这样你就可以缓存它并使用config('project.my_custom_var');调用变量

    【讨论】:

    • 我已经尝试了php artisan config:cache 命令,但在执行此操作后出现此错误:“.../storage/logs 中没有现有目录,并且它不可构建”(该文件夹存在)和解决此问题的唯一方法是删除 bootstrap/cache/config.php 文件...
    • 嗯,您可以检查 config.php 文件以查看它是否使用了正确的变量。也许你打错了,或者在你的代码中某处使用了env()
    • 我从来没有在我的项目中使用 env() 并且我认为没有错字,因为我使用的是默认的 laravel 配置
    • 很难说这里发生了什么。可能是错误的基本路径(因此.../storage/logs 指的是与您想象的不同的目录)。不过,它与原始问题不同。
    • 好的错误已修复,在原点我使用我电脑上的php artisan config:cache,但网站在公司的远程服务器上,所以他把日志的路径放在我的电脑上......我尝试直接在服务器上使用该命令,然后......现在可以使用了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2020-04-12
    • 2014-10-16
    • 2015-06-13
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多