我想为 saas 类型的商店应用程序进行多数据库多租户,以便用户位于主数据库中,并且用户使用此表登录,并且所有商店都有不同的数据库,并且 users_table 有商店数据库 id,并且所有商店都认为模型使用租户连接。
我尝试使用 Stancl/Tenancy,但它都是关于域和子域的,我希望它使用单个域来完成,并使用 users_table 来存储tenant_id和tenant_db_name并从那里初始化租户。如果不使用租赁套餐也可以。 我是 Laravel 的新手,因此我们将不胜感激。
这个答案有点晚了,但它会对像我这样的未来菜鸟有所帮助。
我正在使用 Laravel 构建 SAAS 应用程序,我的要求是为中央应用程序和租户应用程序使用单个域,并且每个租户应该拥有自己的数据库。我发现了 stancl/tenancy Laravel 包。问题是有些人,比如我,由于缺乏经验和语言而无法理解文档。所以在这里我会尝试使其成为一个简单的分步指南。
第 1 步:安装新的 Laravel
composer create-project laravel/laravel example-app
第2步:安装laravelfortenancy包
composer require stancl/tenancy
运行所需的必要命令
php artisan tenancy:install
然后将服务提供者添加到您的 config/app.php 文件中:
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\TenancyServiceProvider::class, // <-- here
现在,由于我的要求是使用具有多数据库租赁的单个域。该包的默认行为是使用 web.php 文件作为中央路由,使用 tenant.php 作为租户路由。为此,我放弃了 tenant.php 文件,并将 web.php 用于租户和中央应用程序。
使用命令制作客户中间件
php artisan make:middleware VerifyTenant
在 verifyTenant 中,粘贴此代码
public function handle(Request $request, Closure $next): Response
{
if(Auth::check()){
$user = \auth()->user();
$tenant = $user->tenant;
if($tenant){
Tenancy::initialize($tenant);
}
}else{
return Redirect::route("login");
}
return $next($request);
}
在 web.php 中,所有路由都属于 web.php 底部的中心,粘贴此代码。这是特定的中间件,您可以将所有租户路由。
Route::middleware(["verifyTenant"])->group(function () {
});
这样,当您点击任何路线(可能是中心路线或租户路线)时,它就会通过中间件进行过滤和保护。
答案是学习的唯一目的,可能不是最好的解决方案。这是我的个人经验,也许我忘了提及某些事情或做错了什么,但我目前正在构建 SAAS,到目前为止我没有发现这些配置和设置有任何问题。任何建议或改进都是受欢迎的。抱歉我的英语不好:)