【发布时间】:2022-01-17 03:15:55
【问题描述】:
我使用 Laravel 应用程序作为后端,并希望通过 axios 请求动态设置数据库连接(并保持它直到页面刷新),该请求将包含要使用的数据库和凭据。
为此,我将接收到的数据库配置存储在会话中,并在我尝试使用的任何控制器的构造函数中设置环境变量。
以下是 .env 中的默认数据库设置:
DB_DATABASE=database1
DB_USERNAME=username1
DB_PASSWORD=password1
但是,问题似乎是会话没有保持活动状态,因为每个发送的请求都包含不同的会话 ID,因此每当我尝试与数据库交互时都会返回访问被拒绝错误,因为会话变量未定义。
以下是客户端发送请求的方式:
axios
.post("https://data-test.io/api/Setconnection", {
database: "database2",
username: "username2",
password: "password2",
})
.then((result) => {
// console.log(result);
// do stuff here
});
这就是我在会话中存储数据库连接的方式:
class RootController extends Controller
{
public function setConnection(Request $request){
session(['database' => $request->database]);
session(['username' => $request->username]);
session(['password' => $request->password]);
return $request->session()->all(); // this returns the correct values
}
}
我在 api.php 中设置了这样的路由:
Route::post('/Setconnection',[RootController::class, 'setConnection']);
然后,在所有后续请求中,我以这种方式在构造函数中设置连接:
public function __construct() {
Artisan::call('config:cache');
Config::set('database', session('database'));
Config::set('username', session('username'));
Config::set('password', session('password'));
}
public function getConfig(){
return [session('database'),session('username'),session('password')];
// this returns an array of undefined elements.
}
我在这里犯了一个错误,或者这不是我应该如何动态设置数据库连接?如果没有,那么最好的方法是什么?
【问题讨论】:
-
当你使用 Laravel 作为后端时,它基本上是一个 API,API 应该是“无状态的”;每次访问时都很新鲜。您的
setConnection逻辑需要针对每个请求运行,例如通过中间件。这基本上就是“登录”到 API 的工作原理;登录,获取令牌,将该令牌与 每个 后续请求一起发送以验证登录/身份。您可以为此使用相同的逻辑,但您需要重新考虑您的方法。 -
@TimLewis 在这种情况下,鉴于我不想在身份验证过程中使用数据库,哪种方法可以完成这项工作?阅读 Laravel Docs 我看到 Laravel Sanctum 需要建立一个数据库。所以也许发行 JWT 令牌可以在不需要数据库的情况下完成?
-
如果您不想使用数据库,这在技术上是可以的,但是您需要一些方法来确定要使用的数据库。如果您有一组预定义的连接,那么您可以简单地使用
connection: 1(或其他东西)向您的axois请求添加一个全局标题,并验证在每个请求上调用setConnection时等等等等。 -
请使用租赁套餐。哪个会为您做到这一点
标签: php reactjs laravel rest axios