From ac5948dfd178b9fcbc38fe68fce9860772c4b2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Fri, 5 Apr 2024 19:48:50 +0200 Subject: [PATCH] add Tenancy::$findWith --- .../Concerns/InvalidatesResolverCache.php | 8 +------- src/Resolvers/DomainTenantResolver.php | 6 ++++-- src/Resolvers/PathTenantResolver.php | 2 +- src/Resolvers/RequestDataTenantResolver.php | 2 +- src/Tenancy.php | 19 +++++++++++++++++-- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/Database/Concerns/InvalidatesResolverCache.php b/src/Database/Concerns/InvalidatesResolverCache.php index 0d34d9f8..cd9cb25b 100644 --- a/src/Database/Concerns/InvalidatesResolverCache.php +++ b/src/Database/Concerns/InvalidatesResolverCache.php @@ -6,7 +6,6 @@ namespace Stancl\Tenancy\Database\Concerns; use Illuminate\Database\Eloquent\Model; use Stancl\Tenancy\Contracts\Tenant; -use Stancl\Tenancy\Resolvers\Contracts\CachedTenantResolver; use Stancl\Tenancy\Tenancy; trait InvalidatesResolverCache @@ -14,12 +13,7 @@ trait InvalidatesResolverCache public static function bootInvalidatesResolverCache(): void { static::saved(function (Tenant&Model $tenant) { - foreach (Tenancy::cachedResolvers() as $resolver) { - /** @var CachedTenantResolver $resolver */ - $resolver = app($resolver); - - $resolver->invalidateCache($tenant); - } + Tenancy::invalidateResolverCache($tenant); }); } } diff --git a/src/Resolvers/DomainTenantResolver.php b/src/Resolvers/DomainTenantResolver.php index 18f6d3a2..da010dc8 100644 --- a/src/Resolvers/DomainTenantResolver.php +++ b/src/Resolvers/DomainTenantResolver.php @@ -10,6 +10,7 @@ use Stancl\Tenancy\Contracts\Domain; use Stancl\Tenancy\Contracts\SingleDomainTenant; use Stancl\Tenancy\Contracts\Tenant; use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException; +use Stancl\Tenancy\Tenancy; class DomainTenantResolver extends Contracts\CachedTenantResolver { @@ -21,15 +22,16 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver $domain = $args[0]; /** @var Tenant&Model $tenantModel */ - $tenantModel = config('tenancy.models.tenant')::make(); + $tenantModel = tenancy()->model(); if ($tenantModel instanceof SingleDomainTenant) { $tenant = $tenantModel->newQuery() + ->with(Tenancy::$findWith) ->firstWhere('domain', $domain); } else { $tenant = $tenantModel->newQuery() ->whereHas('domains', fn (Builder $query) => $query->where('domain', $domain)) - ->with('domains') + ->with(array_unique(array_merge(Tenancy::$findWith, ['domains']))) ->first(); } diff --git a/src/Resolvers/PathTenantResolver.php b/src/Resolvers/PathTenantResolver.php index cd828800..556ec4a6 100644 --- a/src/Resolvers/PathTenantResolver.php +++ b/src/Resolvers/PathTenantResolver.php @@ -26,7 +26,7 @@ class PathTenantResolver extends Contracts\CachedTenantResolver } if ($key) { - if ($tenant = tenancy()->find($key, $column)) { + if ($tenant = tenancy()->find($key, $column, withRelations: true)) { /** @var Tenant $tenant */ return $tenant; } diff --git a/src/Resolvers/RequestDataTenantResolver.php b/src/Resolvers/RequestDataTenantResolver.php index 49cdc908..7ebc90ab 100644 --- a/src/Resolvers/RequestDataTenantResolver.php +++ b/src/Resolvers/RequestDataTenantResolver.php @@ -20,7 +20,7 @@ class RequestDataTenantResolver extends Contracts\CachedTenantResolver { $payload = (string) $args[0]; - if ($payload && $tenant = tenancy()->find($payload)) { + if ($payload && $tenant = tenancy()->find($payload, withRelations: true)) { return $tenant; } diff --git a/src/Tenancy.php b/src/Tenancy.php index 0a4ef9a3..f15e548c 100644 --- a/src/Tenancy.php +++ b/src/Tenancy.php @@ -28,6 +28,11 @@ class Tenancy /** Is tenancy fully initialized? */ public bool $initialized = false; // todo@docs document the difference between $tenant being set and $initialized being true (e.g. end of initialize() method) + /** + * List of relations to eager load when fetching a tenant via tenancy()->find(). + */ + public static array $findWith = []; + /** Initialize tenancy for the passed tenant. */ public function initialize(Tenant|int|string $tenant): void { @@ -136,10 +141,10 @@ class Tenancy /** * Try to find a tenant using an ID. */ - public static function find(int|string $id, string $column = null): (Tenant&Model)|null + public static function find(int|string $id, string $column = null, bool $withRelations = false): (Tenant&Model)|null { /** @var (Tenant&Model)|null $tenant */ - $tenant = static::model()->firstWhere($column ?? static::model()->getTenantKeyName(), $id); + $tenant = static::model()->with($withRelations ? static::$findWith : [])->firstWhere($column ?? static::model()->getTenantKeyName(), $id); return $tenant; } @@ -221,6 +226,16 @@ class Tenancy return array_keys($cachedResolvers); } + public static function invalidateResolverCache(Tenant&Model $tenant): void + { + foreach (static::cachedResolvers() as $resolver) { + /** @var Resolvers\Contracts\CachedTenantResolver $resolver */ + $resolver = app($resolver); + + $resolver->invalidateCache($tenant); + } + } + /** * Tenant identification middleware used by the package. *