背景
在使用小程序作为多租户系统的客户端时,存在诸多限制,如单小程序的 wx.request
等相关域名只能允许一个。此时为了避免在运营过程种,可能产生维护 n 个客户端的小程序的升级问题。便需要一个统一的小程序请求服务端。
可以通过 header 、request data 等多种方式识别租户。因此有了多租户多识别方式的诞生。
单一小程序多租户
1. 配置租户域名,进行后台管理。
2. 所有租户共用小程序。不共用管理后台。
3. 通过二维码、公众号等各种入口场景进行租户访问。
4. 所有接口请求统一到中心应用,识别租户信息,接入租户系统。
3. 用户登录,根据识别的租户选择登录身份。
6. 验证身份,展示身份对应的客户端信息。
示例
InitializeTenancy.php
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
use Stancl\Tenancy\Middleware\InitializeTenancyByRequestData;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomainOrSubdomain;
class InitializeTenancy
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
// path
// header or query
// subdomain or domain
// domain
try {
return app(InitializeTenancyByPath::class)->handle($request, $next);
} catch (\Throwable $e) {
}
try {
return app(InitializeTenancyByRequestData::class)->handle($request, $next);
} catch (\Throwable $e) {
}
try {
return app(InitializeTenancyByDomainOrSubdomain::class)->handle($request, $next);
} catch (\Throwable $e) {
}
return app(InitializeTenancyByDomain::class)->handle($request, $next);
}
}