当从另一个 Laravel 应用程序发送 Http 请求时,Laravel 使用了不正确的数据库

Posted

技术标签:

【中文标题】当从另一个 Laravel 应用程序发送 Http 请求时,Laravel 使用了不正确的数据库【英文标题】:Laravel uses incorrect database when Http request is sent from another Laravel app 【发布时间】:2021-10-18 12:29:52 【问题描述】:

我似乎遇到了一个奇怪的问题。我正在使用从 laravel 应用程序到另一个 laravel 应用程序的 Http 外观触发发布请求。这两个应用程序都链接到不同的数据库。当我尝试使用邮递员触发相同的端点时,它可以正常工作,但是当从其他 laravel 应用程序触发请求时,收件人 laravel 应用程序会尝试使用发件人应用程序的数据库设置,这不起作用。我目前在 Windows 上使用 Xampp 来托管这两个应用程序,并且软件包是最新版本。有没有人遇到过类似的问题,或者您能提出解决方案吗?

代码如下: 发送 POST 请求的服务(Sender App (1)):

Http::post("http://localhost/second_app/public/api/test", array(
                    'id' => 1,
);

收到请求的代码(Receiver App (2)):

public function test(Request $request)

    $club = Club::find($request->id);

我在日志文件中收到一个错误,指出它正在尝试在 first_app 数据库中查找 clubs 表,而它应该使用 second_app 数据库。 我尝试记录配置和请求。该请求非常大,要在此处发布,但我确认已正确接收。该日志的代码是:

Log::info("Received Request", ['database' => ['driver' => config('database.default'), 'name' => config('database.connections.'.config('database.default').'.database')]]);

如果请求是从 Postman 发送到 second_app 或从 second_app 发送到自身(使用 Http 门面)

[2021-08-17 03:13:56] local.INFO: Received Request "database":"driver":"mysql","name":"second_app" 

如果请求是使用 Http 门面从 first_app 发送到 second_app

[2021-08-17 03:14:01] local.INFO: Received Request "database":"driver":"mysql","name":"first_app" 
[2021-08-17 03:14:01] local.INFO: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'first_app.projects' doesn't exist (SQL: select * from `projects` where `code` = ABC_01 limit 1) "exception":"[object] (Illuminate\\Database\\QueryException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'first_app.projects' doesn't exist (SQL: select * from `projects` where `code` = ABC_01 limit 1) at \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:692)

应用程序的配置与默认设置相同。 .env 包含以下详细信息

#first_app
DB_DATABASE="first_app"

#second_app
DB_DATABASE="second_app"

更新 我也尝试过使用单独的虚拟主机。 firstapp.testsecondapp.test 已设置,文档根目录指向公共目录。问题仍然存在,当从 first_app 发送请求时使用了不正确的配置,但当从 second_app 或 Postman 内部发送请求时,它可以正常工作(就像之前所做的那样)

【问题讨论】:

可能是缓存问题?尝试清除您的配置缓存。 您是否在 Clug 模型中指定了数据库连接? 我尝试清除缓存。如果我通过 Postman 或在第二个应用程序中使用 Http 客户端发送相同的请求,它会很好地工作。当请求从其他 laravel 应用程序发送时,它会失败。 @NikhilVaghela 不,它将使用该应用程序的默认连接,因此我不希望它在环境变化时在每个模型中更改其他参数。 您能否确认来自 Guzzle 的请求实际上是在访问您的 second_app,而不是实际访问发起请求的那个? 是的,我可以确认。第一个应用程序中没有这样的端点,甚至关于错误的日志条目也出现在第二个应用程序中,而不是第一个应用程序中。第二个应用程序正确接收请求数据。 【参考方案1】:

我尝试在收件人应用程序中硬编码 database.php 配置值,而不是使用 env 帮助程序,这解决了问题。看起来 env 帮助程序在接收者应用程序中使用发送者应用程序的环境变量导致了冲突。

【讨论】:

以上是关于当从另一个 Laravel 应用程序发送 Http 请求时,Laravel 使用了不正确的数据库的主要内容,如果未能解决你的问题,请参考以下文章

当从另一个 ViewController 类调用方法时,Xcode 找到一个 nil 变量,其中不应该是任何变量

当从另一个 ObservedObject 链接到 Published 属性时,视图不会对更改做出反应

当从另一个控制器(弹出窗口)访问 UILabel(作为一个插座)时,它仍然为零

仅当从另一个查询中选择时,SQL Select 语句才突然检索错误值

Laravel API CORS

Laravel 从另一个来源获取值