You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨Laravel项目调用API时数据库连接异常问题求助

问题描述

本地运行两个Laravel项目(Project One和Project Two),Project One会向Project Two发起API调用。两个项目使用独立MySQL数据库,Project Two在config/database.php中配置了非默认的mysql_oth数据库连接。但当Project One调用Project Two的API时,Project Two会尝试使用Project One的默认mysql连接,而非配置好的mysql_oth;直接通过Postman请求Project Two的API则能正常使用mysql_oth。

已完成的验证

  • Project Two的config/database.php中mysql_oth连接配置正确
  • Postman直接调用Project Two的API端点时,mysql_oth连接正常工作
  • 仅当Project One调用Project Two时出现该问题,导致Project Two切换到Project One的默认mysql连接
  • 已在两个项目中执行artisan命令清除配置、路由及缓存

代码片段

Project One 代码

$request->authenticate();

$request->session()->regenerate();
    
$response = Http::post('http://localhost:82/laravel/project_2/api/appLogin', [
    'email' => $request->email,
    'password' => $request->password,
])->throw();

if ($response->successful()) {
    $token = $response->json('token');
    
    $request->session()->put('apptoken', $token); // Save token in session
    return redirect()->intended(RouteServiceProvider::HOME);
} else {
    
    Auth::guard('web')->logout();

    $request->session()->invalidate();
    $request->session()->regenerateToken();
    
    return redirect(url('login'))->withErrors(['email' => 'The provided credentials are incorrect -- .']);
}

Project Two 代码

public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    Log::info('API call sent', [
        'method' => request()->method(),
        'url' => request()->url(),
        'data' => request()->all(),
    ]);
    if (Auth::attempt($credentials)) {
        // Authentication successful
        $token = auth()->user()->createToken('authToken')->plainTextToken;
        return response()->json(['token' => $token], 200);
    } else {
        // Authentication failed
        return response()->json(['message' => 'Invalid credentials'], 401);
    }
}

环境配置

Project One

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_one,

Project Two

DB_CONNECTION=mysql_oth
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_two

疑问

  1. 为何Project One调用Project Two时,Project Two会切换到Project One的默认数据库连接?如何避免?
  2. 是否有我忽略的Laravel配置或运行时因素导致该问题?

解决方案

问题根源

核心原因是认证守卫未指定数据库连接,加上本地环境可能存在的环境变量污染:

  • Laravel默认认证守卫会使用default数据库连接(即mysql),即便你在.env中设置了DB_CONNECTION=mysql_oth,如果用户提供者未明确指定连接,认证逻辑仍会走默认的mysql连接。
  • 本地Web服务器(如Apache/Nginx)若配置不当,可能导致两个项目的环境变量被共享,使得Project Two读取到Project One的数据库配置。

具体解决步骤

  1. 强制指定认证守卫的数据库连接
    修改Project Two的config/auth.php,在用户提供者中明确指定使用mysql_oth连接:

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
            'connection' => 'mysql_oth', // 强制绑定非默认连接
        ],
    ],
    

    这样无论请求来自哪里,认证逻辑都会固定使用mysql_oth连接,不受环境变量干扰。

  2. 隔离项目环境变量

    • 确保两个项目的.env文件权限独立,避免被对方读取
    • 检查Web服务器虚拟主机配置,确认每个项目的站点是完全独立的,未共享环境变量或配置文件
    • 若使用Valet/Homestead,确认每个项目的站点配置未被混淆
  3. 强制加载自身环境配置
    在Project Two的bootstrap/app.php中添加代码,明确加载当前项目的.env文件,避免被外部配置覆盖:

    $app->loadEnvironmentFrom('.env');
    
  4. 检查全局环境变量
    打开终端执行echo $DB_CONNECTION,若输出为mysql,说明全局环境变量覆盖了项目配置,需要清除全局的DB_CONNECTION变量。

被忽略的配置点

  • 未修改config/auth.php的用户提供者连接:这是最常见的遗漏点,Laravel默认认证不会自动读取DB_CONNECTION的非默认值
  • 缓存残留:即便执行了config:clear,若Web服务器未重启,可能仍有旧配置缓存,建议重启服务器再测试
  • Session共享:若两个项目使用相同的Session存储或域名,可能导致配置串用,可检查config/session.php中的domain和driver配置

内容的提问来源于stack exchange,提问作者chigs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:47:34