用途:使用 spatie/laravel-multitenancy 构建多租户 Laravel 应用,例如按请求确定当前租户、按租户隔离数据库或缓存、让队列任务与 Artisan 命令感知租户,以及设计房东库(landlord)与租户库的迁移策略。该包有意保持精简:只解析当前租户并在切换时运行任务,不自动添加全局查询作用域或模型隔离。当前租户绑定在 IoC 容器的 currentTenant 键,并写入 Laravel Context 的 tenantId。TenantFinder 从 HTTP 请求解析租户,SwitchTenantTask 在租户成为当前时修改环境(切换数据库、缓存前缀等),forget 时恢复。房东库模型使用 UsesLandlordConnection,租户库模型使用 UsesTenantConnection。
安装与配置:composer require spatie/laravel-multitenancy,然后用 vendor:publish 发布 multitenancy-config 与 multitenancy-migrations,并在 bootstrap/app.php 注册 NeedsTenant 与 EnsureValidTenantSession 中间件。租户查找器在 config/multitenancy.php 配置,DomainTenantFinder 按请求主机匹配 tenants 表的 domain 列,也可继承 TenantFinder 实现 findForRequest。
主要能力:Tenant::current()、makeCurrent()、forgetCurrent()、checkCurrent();execute() 在租户上下文运行后恢复状态,callback() 返回闭包供调度器使用;Landlord::execute() 在任何租户之外运行代码;TenantCollection 提供 eachCurrent、mapCurrent、filterCurrent、rejectCurrent。多数据库需定义 database 为 null 的租户连接和房东连接,并设置连接名。内置切换任务包括 SwitchTenantDatabaseTask、PrefixCacheTask、SwitchRouteCacheTask,也可实现 SwitchTenantTask 自定义,并可通过数组配置传入构造参数。
使用方式:房东迁移执行 php artisan migrate --path=database/migrations/landlord --database=landlord;租户迁移执行 php artisan tenants:artisan "migrate --database=tenant"。租户感知命令使用 TenantAware 与 {--tenant=*} 选项;队列可在配置中全局启用 queues_are_tenant_aware_by_default,或用 TenantAware/NotTenantAware 接口与配置列表逐任务控制;闭包任务需显式传入租户。
限制:切换任务在每次 makeCurrent/forgetCurrent 同步运行,应保持快速;租户感知任务无法解析租户时会抛出 CurrentTenantCouldNotBeDeterminedInTenantAwareJob 并将任务从队列删除;EnsureValidTenantSession 会阻止会话跨租户;命令实例在多租户间复用,需在 handle 顶部重置状态;shared_routes_cache 用于路由相同的情况,避免每租户生成路由文件;Octane 在设置 LARAVEL_OCTANE 时由服务提供者自动接入。具体收费、价格与平台等信息暂未提供。