From a94227a19c7e06946a94e868b3b85f548129e696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Thu, 29 Sep 2022 22:20:55 +0200 Subject: [PATCH] get down to 59 phpstan errors --- phpstan.neon | 10 ++-- .../BatchTenancyBootstrapper.php | 4 +- .../CacheTenancyBootstrapper.php | 19 +++---- .../DatabaseTenancyBootstrapper.php | 6 +-- .../FilesystemTenancyBootstrapper.php | 6 ++- .../Integrations/ScoutTenancyBootstrapper.php | 19 +++---- .../QueueTenancyBootstrapper.php | 25 +++++---- .../RedisTenancyBootstrapper.php | 12 +++-- src/Commands/TenantList.php | 22 ++++---- src/Concerns/DealsWithTenantSymlinks.php | 8 +-- src/Contracts/TenancyBootstrapper.php | 4 +- src/Controllers/TenantAssetsController.php | 2 +- .../Concerns/InvalidatesResolverCache.php | 1 + .../InvalidatesTenantsResolverCache.php | 3 +- src/Database/DatabaseConfig.php | 10 ++-- src/Database/DatabaseManager.php | 53 +++++++------------ src/Database/ParentModelScope.php | 2 +- ...rmissionControlledMySQLDatabaseManager.php | 3 +- src/Database/TenantScope.php | 2 +- src/Features/TenantConfig.php | 13 ++--- src/Features/UniversalRoutes.php | 6 ++- src/Listeners/CreateTenantConnection.php | 16 +++--- src/Listeners/QueueableListener.php | 2 +- src/Middleware/InitializeTenancyByPath.php | 6 ++- src/Tenancy.php | 2 +- tests/AutomaticModeTest.php | 4 +- 26 files changed, 130 insertions(+), 130 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index f325f3ec..17f8f56e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -13,14 +13,16 @@ parameters: - Illuminate\Database\Eloquent\Model ignoreErrors: - - - message: '#Cannot access offset (.*?) on Illuminate\\Contracts\\Foundation\\Application#' - paths: - - src/TenancyServiceProvider.php + - '#Cannot access offset (.*?) on Illuminate\\Contracts\\Foundation\\Application#' + - '#Cannot access offset (.*?) on Illuminate\\Contracts\\Config\\Repository#' - message: '#invalid type Laravel\\Telescope\\IncomingEntry#' paths: - src/Features/TelescopeTags.php + - + message: '#Call to an undefined method Illuminate\\Database\\Eloquent\\Model::getRelationshipToPrimaryModel\(\)#' + paths: + - src/Database/ParentModelScope.php - message: '#Parameter \#1 \$key of method Illuminate\\Contracts\\Cache\\Repository::put\(\) expects string#' paths: diff --git a/src/Bootstrappers/BatchTenancyBootstrapper.php b/src/Bootstrappers/BatchTenancyBootstrapper.php index ccd1c00a..589bdac0 100644 --- a/src/Bootstrappers/BatchTenancyBootstrapper.php +++ b/src/Bootstrappers/BatchTenancyBootstrapper.php @@ -23,14 +23,14 @@ class BatchTenancyBootstrapper implements TenancyBootstrapper ) { } - public function bootstrap(Tenant $tenant) + public function bootstrap(Tenant $tenant): void { // Update batch repository connection to use the tenant connection $this->previousConnection = $this->batchRepository->getConnection(); $this->batchRepository->setConnection($this->databaseManager->connection('tenant')); } - public function revert() + public function revert(): void { if ($this->previousConnection) { // Replace batch repository connection with the previously replaced one diff --git a/src/Bootstrappers/CacheTenancyBootstrapper.php b/src/Bootstrappers/CacheTenancyBootstrapper.php index bef156d2..8dbbc27a 100644 --- a/src/Bootstrappers/CacheTenancyBootstrapper.php +++ b/src/Bootstrappers/CacheTenancyBootstrapper.php @@ -13,18 +13,13 @@ use Stancl\Tenancy\Contracts\Tenant; class CacheTenancyBootstrapper implements TenancyBootstrapper { - /** @var CacheManager */ - protected $originalCache; + protected ?CacheManager $originalCache = null; - /** @var Application */ - protected $app; + public function __construct( + protected Application $app + ) {} - public function __construct(Application $app) - { - $this->app = $app; - } - - public function bootstrap(Tenant $tenant) + public function bootstrap(Tenant $tenant): void { $this->resetFacadeCache(); @@ -34,7 +29,7 @@ class CacheTenancyBootstrapper implements TenancyBootstrapper }); } - public function revert() + public function revert(): void { $this->resetFacadeCache(); @@ -50,7 +45,7 @@ class CacheTenancyBootstrapper implements TenancyBootstrapper * facade has been made prior to bootstrapping tenancy. The * facade has its own cache, separate from the container. */ - public function resetFacadeCache() + public function resetFacadeCache(): void { Cache::clearResolvedInstances(); } diff --git a/src/Bootstrappers/DatabaseTenancyBootstrapper.php b/src/Bootstrappers/DatabaseTenancyBootstrapper.php index dd94bfd4..c6dba079 100644 --- a/src/Bootstrappers/DatabaseTenancyBootstrapper.php +++ b/src/Bootstrappers/DatabaseTenancyBootstrapper.php @@ -8,7 +8,7 @@ use Stancl\Tenancy\Contracts\TenancyBootstrapper; use Stancl\Tenancy\Contracts\Tenant; use Stancl\Tenancy\Database\Contracts\TenantWithDatabase; use Stancl\Tenancy\Database\DatabaseManager; -use Stancl\Tenancy\Exceptions\TenantDatabaseDoesNotExistException; +use Stancl\Tenancy\Database\Exceptions\TenantDatabaseDoesNotExistException; class DatabaseTenancyBootstrapper implements TenancyBootstrapper { @@ -20,7 +20,7 @@ class DatabaseTenancyBootstrapper implements TenancyBootstrapper $this->database = $database; } - public function bootstrap(Tenant $tenant) + public function bootstrap(Tenant $tenant): void { /** @var TenantWithDatabase $tenant */ @@ -35,7 +35,7 @@ class DatabaseTenancyBootstrapper implements TenancyBootstrapper $this->database->connectToTenant($tenant); } - public function revert() + public function revert(): void { $this->database->reconnectToCentral(); } diff --git a/src/Bootstrappers/FilesystemTenancyBootstrapper.php b/src/Bootstrappers/FilesystemTenancyBootstrapper.php index d90d36d0..cb77a752 100644 --- a/src/Bootstrappers/FilesystemTenancyBootstrapper.php +++ b/src/Bootstrappers/FilesystemTenancyBootstrapper.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\Bootstrappers; use Illuminate\Contracts\Foundation\Application; +use Illuminate\Routing\UrlGenerator; use Illuminate\Support\Facades\Storage; use Stancl\Tenancy\Contracts\TenancyBootstrapper; use Stancl\Tenancy\Contracts\Tenant; @@ -27,13 +28,14 @@ class FilesystemTenancyBootstrapper implements TenancyBootstrapper ]; $this->app['url']->macro('setAssetRoot', function ($root) { + /** @var UrlGenerator $this */ $this->assetRoot = $root; return $this; }); } - public function bootstrap(Tenant $tenant) + public function bootstrap(Tenant $tenant): void { $suffix = $this->app['config']['tenancy.filesystem.suffix_base'] . $tenant->getTenantKey(); @@ -91,7 +93,7 @@ class FilesystemTenancyBootstrapper implements TenancyBootstrapper } } - public function revert() + public function revert(): void { // storage_path() $this->app->useStoragePath($this->originalPaths['storage']); diff --git a/src/Bootstrappers/Integrations/ScoutTenancyBootstrapper.php b/src/Bootstrappers/Integrations/ScoutTenancyBootstrapper.php index 49869bb5..195c462d 100644 --- a/src/Bootstrappers/Integrations/ScoutTenancyBootstrapper.php +++ b/src/Bootstrappers/Integrations/ScoutTenancyBootstrapper.php @@ -10,27 +10,22 @@ use Stancl\Tenancy\Contracts\Tenant; class ScoutTenancyBootstrapper implements TenancyBootstrapper { - /** @var Repository */ - protected $config; + protected ?string $originalScoutPrefix = null; - /** @var string */ - protected $originalScoutPrefix; + public function __construct( + protected Repository $config, + ) {} - public function __construct(Repository $config) + public function bootstrap(Tenant $tenant): void { - $this->config = $config; - } - - public function bootstrap(Tenant $tenant) - { - if (! isset($this->originalScoutPrefix)) { + if ($this->originalScoutPrefix !== null) { $this->originalScoutPrefix = $this->config->get('scout.prefix'); } $this->config->set('scout.prefix', $this->getTenantPrefix($tenant)); } - public function revert() + public function revert(): void { $this->config->set('scout.prefix', $this->originalScoutPrefix); } diff --git a/src/Bootstrappers/QueueTenancyBootstrapper.php b/src/Bootstrappers/QueueTenancyBootstrapper.php index 43b9dd20..39bb84c3 100644 --- a/src/Bootstrappers/QueueTenancyBootstrapper.php +++ b/src/Bootstrappers/QueueTenancyBootstrapper.php @@ -39,7 +39,7 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper * However, we're registering a hook to initialize tenancy. Therefore, * we need to register the hook at service provider execution time. */ - public static function __constructStatic(Application $app) + public static function __constructStatic(Application $app): void { static::setUpJobListener($app->make(Dispatcher::class), $app->runningUnitTests()); } @@ -52,7 +52,7 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper $this->setUpPayloadGenerator(); } - protected static function setUpJobListener($dispatcher, $runningTests) + protected static function setUpJobListener(Dispatcher $dispatcher, bool $runningTests): void { $previousTenant = null; @@ -79,7 +79,7 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper $dispatcher->listen(JobFailed::class, $revertToPreviousState); // artisan('queue:work') which fails } - protected static function initializeTenancyForQueue($tenantId) + protected static function initializeTenancyForQueue(string|int $tenantId): void { if (! $tenantId) { // The job is not tenant-aware @@ -97,7 +97,9 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper tenancy()->end(); } - tenancy()->initialize(tenancy()->find($tenantId)); + /** @var Tenant $tenant */ + $tenant = tenancy()->find($tenantId); + tenancy()->initialize($tenant); return; } @@ -112,10 +114,13 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper // Tenancy was either not initialized, or initialized for a different tenant. // Therefore, we initialize it for the correct tenant. - tenancy()->initialize(tenancy()->find($tenantId)); + + /** @var Tenant $tenant */ + $tenant = tenancy()->find($tenantId); + tenancy()->initialize($tenant); } - protected static function revertToPreviousState($event, &$previousTenant) + protected static function revertToPreviousState($event, ?Tenant &$previousTenant): void { $tenantId = $event->job->payload()['tenant_id'] ?? null; @@ -135,7 +140,7 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper } } - protected function setUpPayloadGenerator() + protected function setUpPayloadGenerator(): void { $bootstrapper = &$this; @@ -146,17 +151,17 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper } } - public function bootstrap(Tenant $tenant) + public function bootstrap(Tenant $tenant): void { // } - public function revert() + public function revert(): void { // } - public function getPayload(string $connection) + public function getPayload(string $connection): array { if (! tenancy()->initialized) { return []; diff --git a/src/Bootstrappers/RedisTenancyBootstrapper.php b/src/Bootstrappers/RedisTenancyBootstrapper.php index 7536984e..975a37d5 100644 --- a/src/Bootstrappers/RedisTenancyBootstrapper.php +++ b/src/Bootstrappers/RedisTenancyBootstrapper.php @@ -22,18 +22,21 @@ class RedisTenancyBootstrapper implements TenancyBootstrapper $this->config = $config; } - public function bootstrap(Tenant $tenant) + public function bootstrap(Tenant $tenant): void { foreach ($this->prefixedConnections() as $connection) { $prefix = $this->config['tenancy.redis.prefix_base'] . $tenant->getTenantKey(); $client = Redis::connection($connection)->client(); - $this->originalPrefixes[$connection] = $client->getOption($client::OPT_PREFIX); + /** @var string $originalPrefix */ + $originalPrefix = $client->getOption($client::OPT_PREFIX); + + $this->originalPrefixes[$connection] = $originalPrefix; $client->setOption($client::OPT_PREFIX, $prefix); } } - public function revert() + public function revert(): void { foreach ($this->prefixedConnections() as $connection) { $client = Redis::connection($connection)->client(); @@ -44,7 +47,8 @@ class RedisTenancyBootstrapper implements TenancyBootstrapper $this->originalPrefixes = []; } - protected function prefixedConnections() + /** @return string[] */ + protected function prefixedConnections(): array { return $this->config['tenancy.redis.prefixed_connections']; } diff --git a/src/Commands/TenantList.php b/src/Commands/TenantList.php index ce8dfcec..9fd3f8bd 100644 --- a/src/Commands/TenantList.php +++ b/src/Commands/TenantList.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\Commands; use Illuminate\Console\Command; +use Illuminate\Database\Eloquent\Model; use Stancl\Tenancy\Contracts\Tenant; class TenantList extends Command @@ -16,15 +17,16 @@ class TenantList extends Command public function handle(): void { $this->info('Listing all tenants.'); - tenancy() - ->query() - ->cursor() - ->each(function (Tenant $tenant) { - if ($tenant->domains) { - $this->line("[Tenant] {$tenant->getTenantKeyName()}: {$tenant->getTenantKey()} @ " . implode('; ', $tenant->domains->pluck('domain')->toArray() ?? [])); - } else { - $this->line("[Tenant] {$tenant->getTenantKeyName()}: {$tenant->getTenantKey()}"); - } - }); + + $tenants = tenancy()->query()->cursor(); + + foreach ($tenants as $tenant) { + /** @var Model&Tenant $tenant */ + if ($tenant->domains) { + $this->line("[Tenant] {$tenant->getTenantKeyName()}: {$tenant->getTenantKey()} @ " . implode('; ', $tenant->domains->pluck('domain')->toArray() ?? [])); + } else { + $this->line("[Tenant] {$tenant->getTenantKeyName()}: {$tenant->getTenantKey()}"); + } + } } } diff --git a/src/Concerns/DealsWithTenantSymlinks.php b/src/Concerns/DealsWithTenantSymlinks.php index d6d6f5f2..5f3baf5b 100644 --- a/src/Concerns/DealsWithTenantSymlinks.php +++ b/src/Concerns/DealsWithTenantSymlinks.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\Concerns; use Illuminate\Support\Collection; -use Stancl\Tenancy\Database\Models\Tenant; +use Stancl\Tenancy\Contracts\Tenant; trait DealsWithTenantSymlinks { @@ -23,12 +23,14 @@ trait DealsWithTenantSymlinks $diskUrls = config('tenancy.filesystem.url_override'); $disks = config('tenancy.filesystem.root_override'); $suffixBase = config('tenancy.filesystem.suffix_base'); - $symlinks = collect(); $tenantKey = $tenant->getTenantKey(); + /** @var Collection> $symlinks */ + $symlinks = collect([]); + foreach ($diskUrls as $disk => $publicPath) { $storagePath = str_replace('%storage_path%', $suffixBase . $tenantKey, $disks[$disk]); - $publicPath = str_replace('%tenant_id%', $tenantKey, $publicPath); + $publicPath = str_replace('%tenant_id%', (string) $tenantKey, $publicPath); tenancy()->central(function () use ($symlinks, $publicPath, $storagePath) { $symlinks->push([public_path($publicPath) => storage_path($storagePath)]); diff --git a/src/Contracts/TenancyBootstrapper.php b/src/Contracts/TenancyBootstrapper.php index 8b43755f..6da5c537 100644 --- a/src/Contracts/TenancyBootstrapper.php +++ b/src/Contracts/TenancyBootstrapper.php @@ -9,7 +9,7 @@ namespace Stancl\Tenancy\Contracts; */ interface TenancyBootstrapper { - public function bootstrap(Tenant $tenant); + public function bootstrap(Tenant $tenant): void; - public function revert(); + public function revert(): void; } diff --git a/src/Controllers/TenantAssetsController.php b/src/Controllers/TenantAssetsController.php index 7e032c2c..278493c6 100644 --- a/src/Controllers/TenantAssetsController.php +++ b/src/Controllers/TenantAssetsController.php @@ -10,7 +10,7 @@ use Throwable; class TenantAssetsController extends Controller // todo rename this to TenantAssetController & update references in docs { - public static string|array|Closure $tenancyMiddleware = Stancl\Tenancy\Middleware\InitializeTenancyByDomain::class; + public static string|array|Closure $tenancyMiddleware = \Stancl\Tenancy\Middleware\InitializeTenancyByDomain::class; public function __construct() { diff --git a/src/Database/Concerns/InvalidatesResolverCache.php b/src/Database/Concerns/InvalidatesResolverCache.php index 3b864789..82a85997 100644 --- a/src/Database/Concerns/InvalidatesResolverCache.php +++ b/src/Database/Concerns/InvalidatesResolverCache.php @@ -10,6 +10,7 @@ use Stancl\Tenancy\Resolvers\Contracts\CachedTenantResolver; trait InvalidatesResolverCache { + /** @var array> */ public static $resolvers = [ Resolvers\DomainTenantResolver::class, Resolvers\PathTenantResolver::class, diff --git a/src/Database/Concerns/InvalidatesTenantsResolverCache.php b/src/Database/Concerns/InvalidatesTenantsResolverCache.php index 8d7c2845..aa7fac4b 100644 --- a/src/Database/Concerns/InvalidatesTenantsResolverCache.php +++ b/src/Database/Concerns/InvalidatesTenantsResolverCache.php @@ -13,7 +13,8 @@ use Stancl\Tenancy\Resolvers\Contracts\CachedTenantResolver; */ trait InvalidatesTenantsResolverCache { - public static $resolvers = [ + /** @var array> */ + public static array $resolvers = [ // todo single source of truth for this here and in InvalidatesResolverCache Resolvers\DomainTenantResolver::class, Resolvers\PathTenantResolver::class, Resolvers\RequestDataTenantResolver::class, diff --git a/src/Database/DatabaseConfig.php b/src/Database/DatabaseConfig.php index a4c79582..f024b442 100644 --- a/src/Database/DatabaseConfig.php +++ b/src/Database/DatabaseConfig.php @@ -26,20 +26,20 @@ class DatabaseConfig public static function __constructStatic(): void { - static::$usernameGenerator = static::$usernameGenerator ?? function (Tenant $tenant) { + static::$usernameGenerator = static::$usernameGenerator ?? function (Model&Tenant $tenant) { return Str::random(16); }; - static::$passwordGenerator = static::$passwordGenerator ?? function (Tenant $tenant) { + static::$passwordGenerator = static::$passwordGenerator ?? function (Model&Tenant $tenant) { return Hash::make(Str::random(32)); }; - static::$databaseNameGenerator = static::$databaseNameGenerator ?? function (Tenant $tenant) { + static::$databaseNameGenerator = static::$databaseNameGenerator ?? function (Model&Tenant $tenant) { return config('tenancy.database.prefix') . $tenant->getTenantKey() . config('tenancy.database.suffix'); }; } - public function __construct(Tenant $tenant) + public function __construct(Model&Tenant $tenant) { static::__constructStatic(); @@ -61,7 +61,7 @@ class DatabaseConfig static::$passwordGenerator = $passwordGenerator; } - public function getName(): ?string + public function getName(): string { return $this->tenant->getInternal('db_name') ?? (static::$databaseNameGenerator)($this->tenant); } diff --git a/src/Database/DatabaseManager.php b/src/Database/DatabaseManager.php index a92ccb7b..edde7515 100644 --- a/src/Database/DatabaseManager.php +++ b/src/Database/DatabaseManager.php @@ -15,25 +15,13 @@ use Stancl\Tenancy\Database\Contracts\TenantWithDatabase; */ class DatabaseManager { - /** @var Application */ - protected $app; + public function __construct( + protected Application $app, + protected BaseDatabaseManager $database, + protected Repository $config, + ) {} - /** @var BaseDatabaseManager */ - protected $database; - - /** @var Repository */ - protected $config; - - public function __construct(Application $app, BaseDatabaseManager $database, Repository $config) - { - $this->app = $app; - $this->database = $database; - $this->config = $config; - } - - /** - * Connect to a tenant's database. - */ + /** Connect to a tenant's database. */ public function connectToTenant(TenantWithDatabase $tenant): void { $this->purgeTenantConnection(); @@ -41,35 +29,27 @@ class DatabaseManager $this->setDefaultConnection('tenant'); } - /** - * Reconnect to the default non-tenant connection. - */ + /** Reconnect to the default non-tenant connection. */ public function reconnectToCentral(): void { $this->purgeTenantConnection(); $this->setDefaultConnection($this->config->get('tenancy.database.central_connection')); } - /** - * Change the default database connection config. - */ + /** Change the default database connection config. */ public function setDefaultConnection(string $connection): void { $this->config['database.default'] = $connection; $this->database->setDefaultConnection($connection); } - /** - * Create the tenant database connection. - */ + /** Create the tenant database connection. */ public function createTenantConnection(TenantWithDatabase $tenant): void { $this->config['database.connections.tenant'] = $tenant->database()->connection(); } - /** - * Purge the tenant database connection. - */ + /** Purge the tenant database connection. */ public function purgeTenantConnection(): void { if (array_key_exists('tenant', $this->database->getConnections())) { @@ -83,8 +63,8 @@ class DatabaseManager * Check if a tenant can be created. * * @throws TenantCannotBeCreatedException - * @throws DatabaseManagerNotRegisteredException - * @throws TenantDatabaseAlreadyExistsException + * @throws Exceptions\DatabaseManagerNotRegisteredException + * @throws Exceptions\TenantDatabaseAlreadyExistsException */ public function ensureTenantCanBeCreated(TenantWithDatabase $tenant): void { @@ -94,8 +74,13 @@ class DatabaseManager throw new Exceptions\TenantDatabaseAlreadyExistsException($database); } - if ($manager instanceof Contracts\ManagesDatabaseUsers && $manager->userExists($username = $tenant->database()->getUsername())) { - throw new Exceptions\TenantDatabaseUserAlreadyExistsException($username); + if ($manager instanceof Contracts\ManagesDatabaseUsers) { + /** @var string $username */ + $username = $tenant->database()->getUsername(); + + if ($manager->userExists($username)) { + throw new Exceptions\TenantDatabaseUserAlreadyExistsException($username); + } } } } diff --git a/src/Database/ParentModelScope.php b/src/Database/ParentModelScope.php index 78f5de20..cfc003c1 100644 --- a/src/Database/ParentModelScope.php +++ b/src/Database/ParentModelScope.php @@ -19,7 +19,7 @@ class ParentModelScope implements Scope $builder->whereHas($builder->getModel()->getRelationshipToPrimaryModel()); } - public function extend(Builder $builder) + public function extend(Builder $builder): void { $builder->macro('withoutParentModel', function (Builder $builder) { return $builder->withoutGlobalScope($this); diff --git a/src/Database/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php b/src/Database/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php index 337864dc..f7e7440e 100644 --- a/src/Database/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php +++ b/src/Database/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php @@ -12,7 +12,8 @@ class PermissionControlledMySQLDatabaseManager extends MySQLDatabaseManager impl { use CreatesDatabaseUsers; - public static $grants = [ + /** @var string[] */ + public static array $grants = [ 'ALTER', 'ALTER ROUTINE', 'CREATE', 'CREATE ROUTINE', 'CREATE TEMPORARY TABLES', 'CREATE VIEW', 'DELETE', 'DROP', 'EVENT', 'EXECUTE', 'INDEX', 'INSERT', 'LOCK TABLES', 'REFERENCES', 'SELECT', 'SHOW VIEW', 'TRIGGER', 'UPDATE', diff --git a/src/Database/TenantScope.php b/src/Database/TenantScope.php index 8592f16c..8b887ac0 100644 --- a/src/Database/TenantScope.php +++ b/src/Database/TenantScope.php @@ -20,7 +20,7 @@ class TenantScope implements Scope $builder->where($model->qualifyColumn(BelongsToTenant::$tenantIdColumn), tenant()->getTenantKey()); } - public function extend(Builder $builder) + public function extend(Builder $builder): void { $builder->macro('withoutTenancy', function (Builder $builder) { return $builder->withoutGlobalScope($this); diff --git a/src/Features/TenantConfig.php b/src/Features/TenantConfig.php index 50756b2c..33f1c7dd 100644 --- a/src/Features/TenantConfig.php +++ b/src/Features/TenantConfig.php @@ -16,19 +16,16 @@ use Stancl\Tenancy\Tenancy; class TenantConfig implements Feature { - /** @var Repository */ - protected $config; - public array $originalConfig = []; - public static $storageToConfigMap = [ + /** @var array */ + public static array $storageToConfigMap = [ // 'paypal_api_key' => 'services.paypal.api_key', ]; - public function __construct(Repository $config) - { - $this->config = $config; - } + public function __construct( + protected Repository $config, + ) {} public function bootstrap(Tenancy $tenancy): void { diff --git a/src/Features/UniversalRoutes.php b/src/Features/UniversalRoutes.php index e327b5d3..ad0433fc 100644 --- a/src/Features/UniversalRoutes.php +++ b/src/Features/UniversalRoutes.php @@ -16,6 +16,7 @@ class UniversalRoutes implements Feature public static string $middlewareGroup = 'universal'; // todo docblock + /** @var array> */ public static array $identificationMiddlewares = [ Middleware\InitializeTenancyByDomain::class, Middleware\InitializeTenancyBySubdomain::class, @@ -42,7 +43,10 @@ class UniversalRoutes implements Feature public static function routeHasMiddleware(Route $route, string $middleware): bool { - if (in_array($middleware, $route->middleware(), true)) { + /** @var array $routeMiddleware */ + $routeMiddleware = $route->middleware(); + + if (in_array($middleware, $routeMiddleware, true)) { return true; } diff --git a/src/Listeners/CreateTenantConnection.php b/src/Listeners/CreateTenantConnection.php index 01351c08..73edc6bf 100644 --- a/src/Listeners/CreateTenantConnection.php +++ b/src/Listeners/CreateTenantConnection.php @@ -4,21 +4,21 @@ declare(strict_types=1); namespace Stancl\Tenancy\Listeners; +use Stancl\Tenancy\Database\Contracts\TenantWithDatabase; use Stancl\Tenancy\Database\DatabaseManager; use Stancl\Tenancy\Events\Contracts\TenantEvent; class CreateTenantConnection { - /** @var DatabaseManager */ - protected $database; - - public function __construct(DatabaseManager $database) - { - $this->database = $database; - } + public function __construct( + protected DatabaseManager $database, + ) {} public function handle(TenantEvent $event): void { - $this->database->createTenantConnection($event->tenant); + /** @var TenantWithDatabase */ + $tenant = $event->tenant; + + $this->database->createTenantConnection($tenant); } } diff --git a/src/Listeners/QueueableListener.php b/src/Listeners/QueueableListener.php index e10c1e7a..f486873d 100644 --- a/src/Listeners/QueueableListener.php +++ b/src/Listeners/QueueableListener.php @@ -13,7 +13,7 @@ abstract class QueueableListener implements ShouldQueue { public static bool $shouldQueue = false; - public function shouldQueue($event): bool + public function shouldQueue(object $event): bool { if (static::$shouldQueue) { return true; diff --git a/src/Middleware/InitializeTenancyByPath.php b/src/Middleware/InitializeTenancyByPath.php index e88a1950..d4733f62 100644 --- a/src/Middleware/InitializeTenancyByPath.php +++ b/src/Middleware/InitializeTenancyByPath.php @@ -9,6 +9,7 @@ use Illuminate\Http\Request; use Illuminate\Routing\Route; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\URL; +use Stancl\Tenancy\Contracts\Tenant; use Stancl\Tenancy\Events\InitializingTenancy; use Stancl\Tenancy\Exceptions\RouteIsMissingTenantParameterException; use Stancl\Tenancy\Resolvers\PathTenantResolver; @@ -36,7 +37,10 @@ class InitializeTenancyByPath extends IdentificationMiddleware if ($route->parameterNames()[0] === PathTenantResolver::$tenantParameterName) { // Set tenant as a default parameter for the URLs in the current request Event::listen(InitializingTenancy::class, function (InitializingTenancy $event) { - URL::defaults([PathTenantResolver::$tenantParameterName => $event->tenancy->tenant->getTenantKey()]); + /** @var Tenant $tenant */ + $tenant = $event->tenancy->tenant; + + URL::defaults([PathTenantResolver::$tenantParameterName => $tenant->getTenantKey()]); }); return $this->initializeTenancy( diff --git a/src/Tenancy.php b/src/Tenancy.php index 0a8d4542..c93df4fb 100644 --- a/src/Tenancy.php +++ b/src/Tenancy.php @@ -132,7 +132,7 @@ class Tenancy * Run a callback for multiple tenants. * More performant than running $tenant->run() one by one. * - * @param Tenant[]|\Traversable|string[]|null $tenants + * @param array|array|\Traversable|null $tenants */ public function runForMultiple($tenants, Closure $callback): void { diff --git a/tests/AutomaticModeTest.php b/tests/AutomaticModeTest.php index ab484ccf..fc740fc1 100644 --- a/tests/AutomaticModeTest.php +++ b/tests/AutomaticModeTest.php @@ -107,12 +107,12 @@ function contextIsSwitchedWhenTenancyInitialized() class MyBootstrapper implements TenancyBootstrapper { - public function bootstrap(\Stancl\Tenancy\Contracts\Tenant $tenant) + public function bootstrap(\Stancl\Tenancy\Contracts\Tenant $tenant): void { app()->instance('tenancy_initialized_for_tenant', $tenant->getTenantKey()); } - public function revert() + public function revert(): void { app()->instance('tenancy_ended', true); }