mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 08:24:04 +00:00
* Add SingleDomainTenant * Add logic for single domain tenants * Test that the single domain approach works (wip) * Fix code style (php-cs-fixer) * Simplify SubdomainTest tests * Add single domain tenant conditions to DomainTenantResolver * Test single domain tenants in resolver test * Fix test name typo * Improve runUsingBothDomainApproaches() * Delete extra tenancy()->end() * Test early identification with both domain approaches * Test that things work with both domain approaches in the rest of the tests * Fix falsely passing test * Fix PHPStan errors * Change SingleDomainTenant to a contract, add SingleDomainTenant test model * Fix TenantList domainsCLI() * Improve setCurrentDomain() check * Fix code style (php-cs-fixer) * Add annotation * Revert getCustomColumns() change * Add comments * Use the domain returned by the closure in runUsingBoth..() * Delete `migrate` from test * Improve test names * Use variable instead of repeating the same string multiple times * Update comment * Add comment * Clean up PreventAccess test * Don't assign domain to a single-use variable * Update comments * Uncomment datasets * Add todo * Fix user impersonation test * Don't specify tenant key when creating tenant in runUsingBoth..() * Improve universal route test * Improve `runUsingBothDomainApproaches()` * Add tests specific to single domain tenants * Get rid of the runUsingBothDomainApproaches method * Add test file specific for the single domain tenant feature * Rename test * Make getCustomColumns() function static * Positiopn datasets differently * Fix early id test * Add prevent MW to route MW in test * Fix single domain tenant tests * Delete SingleDomainTenantTest (CI testing) * Add the test file back * TUrn APP_DEBUG on temporarily * Turn debug off * Try creating tenant with non-unique domain (CI testing) * dd duplicate tenant records * Revert testing change * Make SingleDomainTenant not extend base tenant (VirtualColumn issues) * Fix early id test * add todo * Use dev-master stancl/virtualcolumn * Make SingleDomainTenant extend the tenant base model * remove todo * Clean up EarlyIdentificationTest changes * Finish test file cleanup * Fix test * improve test --------- Co-authored-by: PHP CS Fixer <phpcsfixer@example.com> Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
85 lines
2.3 KiB
PHP
85 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Stancl\Tenancy\Resolvers\Contracts;
|
|
|
|
use Illuminate\Contracts\Cache\Factory;
|
|
use Illuminate\Contracts\Cache\Repository;
|
|
use Stancl\Tenancy\Contracts\Tenant;
|
|
use Stancl\Tenancy\Contracts\TenantResolver;
|
|
|
|
abstract class CachedTenantResolver implements TenantResolver
|
|
{
|
|
/** @var Repository */
|
|
protected $cache;
|
|
|
|
public function __construct(Factory $cache)
|
|
{
|
|
$this->cache = $cache->store(static::cacheStore());
|
|
}
|
|
|
|
public function resolve(mixed ...$args): Tenant
|
|
{
|
|
if (! static::shouldCache()) {
|
|
return $this->resolveWithoutCache(...$args);
|
|
}
|
|
|
|
$key = $this->getCacheKey(...$args);
|
|
|
|
if ($tenant = $this->cache->get($key)) {
|
|
$this->resolved($tenant, ...$args);
|
|
|
|
return $tenant;
|
|
}
|
|
|
|
$tenant = $this->resolveWithoutCache(...$args);
|
|
$this->cache->put($key, $tenant, static::cacheTTL());
|
|
|
|
return $tenant;
|
|
}
|
|
|
|
public function invalidateCache(Tenant $tenant): void
|
|
{
|
|
if (! static::shouldCache()) {
|
|
return;
|
|
}
|
|
|
|
foreach ($this->getArgsForTenant($tenant) as $args) {
|
|
$this->cache->forget($this->getCacheKey(...$args));
|
|
}
|
|
}
|
|
|
|
public function getCacheKey(mixed ...$args): string
|
|
{
|
|
return '_tenancy_resolver:' . static::class . ':' . json_encode($args);
|
|
}
|
|
|
|
abstract public function resolveWithoutCache(mixed ...$args): Tenant;
|
|
|
|
public function resolved(Tenant $tenant, mixed ...$args): void
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Get all the arg combinations for resolve() that can be used to find this tenant.
|
|
*
|
|
* @return array[]
|
|
*/
|
|
abstract public function getArgsForTenant(Tenant $tenant): array; // todo@v4 make it clear that this is only used for cache *invalidation*
|
|
|
|
public static function shouldCache(): bool
|
|
{
|
|
return config('tenancy.identification.resolvers.' . static::class . '.cache') ?? false;
|
|
}
|
|
|
|
public static function cacheTTL(): int
|
|
{
|
|
return config('tenancy.identification.resolvers.' . static::class . '.cache_ttl') ?? 3600;
|
|
}
|
|
|
|
public static function cacheStore(): string|null
|
|
{
|
|
return config('tenancy.identification.resolvers.' . static::class . '.cache_store');
|
|
}
|
|
}
|