From c1fac4bb213f78737e896f21a201e19b296d530f Mon Sep 17 00:00:00 2001 From: Hayatunnabi Nabil Date: Sat, 8 Nov 2025 22:13:10 +0600 Subject: [PATCH] refactor: Improve domain resolution logic in DomainTenantResolver --- src/Resolvers/DomainTenantResolver.php | 33 ++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/Resolvers/DomainTenantResolver.php b/src/Resolvers/DomainTenantResolver.php index 360851df..63f440b6 100644 --- a/src/Resolvers/DomainTenantResolver.php +++ b/src/Resolvers/DomainTenantResolver.php @@ -69,12 +69,21 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver protected static function setCurrentDomain(Tenant $tenant, string $domain): void { /** @var Tenant&Model $tenant */ + $domainModelClass = config('tenancy.models.domain'); + if ($tenant instanceof SingleDomainTenant) { - $domainModelClass = config('tenancy.models.domain'); - /** @var Domain&Model $domainModel */ + /** + * Single-domain tenants keep their hostname on the tenant row, so there's no Domain record + * we could look up. Build an in-memory instance that carries enough data for the Domain + * contract binding (hostname + tenant relation). + * + * @var Domain&Model $domainModel + */ $domainModel = new $domainModelClass; - $domainModel->setAttribute('domain', $domain); - $domainModel->setAttribute(Tenancy::tenantKeyColumn(), $tenant->getTenantKey()); + $domainModel->forceFill([ + 'domain' => $domain, + Tenancy::tenantKeyColumn() => $tenant->getTenantKey(), + ]); $domainModel->setRelation('tenant', $tenant); static::$currentDomain = $domainModel; @@ -82,7 +91,21 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver return; } - static::$currentDomain = $tenant->domains->where('domain', $domain)->first(); + if (! $tenant->relationLoaded('domains')) { + $tenant->loadMissing('domains'); + } + + /** @var Domain&Model|null $resolvedDomain */ + $resolvedDomain = $tenant->domains->firstWhere('domain', $domain); + + if (! $resolvedDomain) { + $resolvedDomain = $domainModelClass::query() + ->where('domain', $domain) + ->where(Tenancy::tenantKeyColumn(), $tenant->getTenantKey()) + ->first(); + } + + static::$currentDomain = $resolvedDomain; } public function getPossibleCacheKeys(Tenant&Model $tenant): array