Skip to content

Commit

Permalink
chore: A few more updates and slight refactors
Browse files Browse the repository at this point in the history
  • Loading branch information
ollieread committed Jan 27, 2025
1 parent 8afe688 commit 7f831b9
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 65 deletions.
2 changes: 1 addition & 1 deletion src/Concerns/AwareOfApp.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public function setApp(Application $app): static
return $this;
}

protected function getApp(): Application
public function getApp(): Application
{
return $this->app;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Concerns/AwareOfSprout.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public function setSprout(Sprout $sprout): static
return $this;
}

protected function getSprout(): Sprout
public function getSprout(): Sprout
{
return $this->sprout;
}
Expand Down
19 changes: 6 additions & 13 deletions src/Managers/ServiceOverrideManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
namespace Sprout\Managers;

use Illuminate\Contracts\Foundation\Application;
use Sprout\Concerns\AwareOfApp;
use Sprout\Concerns\AwareOfSprout;
use Sprout\Contracts\BootableServiceOverride;
use Sprout\Contracts\ServiceOverride;
use Sprout\Contracts\Tenancy;
Expand All @@ -27,17 +29,7 @@
*/
final class ServiceOverrideManager
{
/**
* The Laravel application
*
* @var \Illuminate\Contracts\Foundation\Application
*/
protected Application $app;

/**
* @var \Sprout\Sprout
*/
private Sprout $sprout;
use AwareOfApp, AwareOfSprout;

/**
* @var array<string, \Sprout\Contracts\ServiceOverride>
Expand Down Expand Up @@ -69,10 +61,9 @@ final class ServiceOverrideManager
*
* @param \Illuminate\Contracts\Foundation\Application $app
*/
public function __construct(Application $app, Sprout $sprout)
public function __construct(Application $app)
{
$this->app = $app;
$this->sprout = $sprout;
}

/**
Expand Down Expand Up @@ -376,6 +367,8 @@ protected function register(string $service): self
// and config, as we know the constructor signature
$override = $this->app->make($driver, compact('service', 'config'));

/** @var \Sprout\Contracts\ServiceOverride $override */

if (method_exists($override, 'setApp')) {
$override->setApp($this->app);
}
Expand Down
7 changes: 3 additions & 4 deletions src/Overrides/SessionOverride.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use Sprout\Contracts\BootableServiceOverride;
use Sprout\Contracts\Tenancy;
use Sprout\Contracts\Tenant;
use Sprout\Contracts\TenantAware;
use Sprout\Overrides\Session\SproutDatabaseSessionHandlerCreator;
use Sprout\Overrides\Session\SproutFileSessionHandlerCreator;
use Sprout\Sprout;
Expand Down Expand Up @@ -87,8 +86,8 @@ protected function addDriver(SessionManager $manager, Application $app, Sprout $
public function setup(Tenancy $tenancy, Tenant $tenant): void
{
/** @var \Illuminate\Contracts\Config\Repository $config */
$config = $this->app->make('config');
$settings = $this->sprout->settings();
$config = $this->getApp()->make('config');
$settings = $this->getSprout()->settings();

if (! $settings->has('original.session')) {
/** @var array<string, mixed> $original */
Expand Down Expand Up @@ -172,7 +171,7 @@ private function refreshSessionStore(?Tenancy $tenancy = null, ?Tenant $tenant =
{
// We only want to touch this if the session manager has actually been
// loaded, and is therefore most likely being used
if ($this->app->resolved('session')) {
if ($this->getApp()->resolved('session')) {
$manager = $this->getApp()->make('session');

// If there are no loaded drivers, we can exit early
Expand Down
71 changes: 47 additions & 24 deletions src/Sprout.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
namespace Sprout;

use Illuminate\Contracts\Foundation\Application;
use Illuminate\Routing\Router;
use Sprout\Contracts\Tenancy;
use Sprout\Contracts\Tenant;
use Sprout\Managers\IdentityResolverManager;
use Sprout\Managers\ServiceOverrideManager;
use Sprout\Managers\TenancyManager;
use Sprout\Managers\TenantProviderManager;
use Sprout\Support\ResolutionHelper;
use Sprout\Support\ResolutionHook;
use Sprout\Support\SettingsRepository;

Expand All @@ -30,7 +32,27 @@ final class Sprout
/**
* @var array<int, \Sprout\Contracts\Tenancy<\Sprout\Contracts\Tenant>>
*/
private array $tenancies = [];
private array $currentTenancies = [];

/**
* @var \Sprout\Managers\ServiceOverrideManager
*/
private ServiceOverrideManager $overrides;

/**
* @var \Sprout\Managers\TenantProviderManager
*/
private TenantProviderManager $providers;

/**
* @var \Sprout\Managers\IdentityResolverManager
*/
private IdentityResolverManager $resolvers;

/**
* @var \Sprout\Managers\TenancyManager
*/
private TenancyManager $tenancies;

/**
* @var bool
Expand All @@ -53,10 +75,21 @@ final class Sprout
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Sprout\Support\SettingsRepository $settings
*/
public function __construct(Application $app, SettingsRepository $settings)
public function __construct(
Application $app,
SettingsRepository $settings,
?TenantProviderManager $providers = null,
?IdentityResolverManager $resolvers = null,
?TenancyManager $tenancies = null,
?ServiceOverrideManager $overrides = null
)
{
$this->app = $app;
$this->settings = $settings;
$this->app = $app;
$this->settings = $settings;
$this->providers = $providers ?? new TenantProviderManager($app);
$this->resolvers = $resolvers ?? new IdentityResolverManager($app);
$this->tenancies = $tenancies ?? new TenancyManager($app, $this->providers);
$this->overrides = $overrides ?? (new ServiceOverrideManager($app))->setSprout($this);
}

/**
Expand Down Expand Up @@ -109,11 +142,11 @@ public function settings(): SettingsRepository
public function setCurrentTenancy(Tenancy $tenancy): void
{
if ($this->getCurrentTenancy() !== $tenancy) {
$this->tenancies[] = $tenancy;
$this->currentTenancies[] = $tenancy;

// This is a bit of a cheat to enable the refreshing of the Tenancy
$this->app->forgetExtenders(Tenancy::class);
$this->app->extend(Tenancy::class, fn(?Tenancy $tenancy) => $tenancy);
$this->app->extend(Tenancy::class, fn (?Tenancy $tenancy) => $tenancy);
}

$this->markAsInContext();
Expand All @@ -126,7 +159,7 @@ public function setCurrentTenancy(Tenancy $tenancy): void
*/
public function hasCurrentTenancy(): bool
{
return count($this->tenancies) > 0;
return count($this->currentTenancies) > 0;
}

/**
Expand All @@ -137,7 +170,7 @@ public function hasCurrentTenancy(): bool
public function getCurrentTenancy(): ?Tenancy
{
if ($this->hasCurrentTenancy()) {
return $this->tenancies[count($this->tenancies) - 1];
return $this->currentTenancies[count($this->currentTenancies) - 1];
}

return null;
Expand All @@ -150,7 +183,7 @@ public function getCurrentTenancy(): ?Tenancy
*/
public function getAllCurrentTenancies(): array
{
return $this->tenancies;
return $this->currentTenancies;
}

/**
Expand All @@ -166,7 +199,7 @@ public function resetTenancies(): self
}
}

$this->tenancies = [];
$this->currentTenancies = [];

return $this;
}
Expand All @@ -175,48 +208,40 @@ public function resetTenancies(): self
* Get the identity resolver manager
*
* @return \Sprout\Managers\IdentityResolverManager
*
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function resolvers(): IdentityResolverManager
{
return $this->app->make(IdentityResolverManager::class);
return $this->resolvers;
}

/**
* Get the tenant providers manager
*
* @return \Sprout\Managers\TenantProviderManager
*
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function providers(): TenantProviderManager
{
return $this->app->make(TenantProviderManager::class);
return $this->providers;
}

/**
* Get the tenancy manager
*
* @return \Sprout\Managers\TenancyManager
*
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function tenancies(): TenancyManager
{
return $this->app->make(TenancyManager::class);
return $this->tenancies;
}

/**
* Get the service override manager
*
* @return \Sprout\Managers\ServiceOverrideManager
*
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function overrides(): ServiceOverrideManager
{
return $this->app->make(ServiceOverrideManager::class);
return $this->overrides;
}

/**
Expand Down Expand Up @@ -295,9 +320,7 @@ public function withinContext(): bool
*
* @return string
*
* @throws \Illuminate\Contracts\Container\BindingResolutionException
* @throws \Sprout\Exceptions\MisconfigurationException
* @throws \Sprout\Exceptions\TenantMissingException
*/
public function route(string $name, Tenant $tenant, ?string $resolver = null, ?string $tenancy = null, array $parameters = [], bool $absolute = true): string
{
Expand Down
17 changes: 5 additions & 12 deletions src/SproutServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,23 +62,16 @@ private function registerDefaultBindings(): void
private function registerManagers(): void
{
// Register the tenant provider manager
$this->app->singleton(TenantProviderManager::class, function ($app) {
return new TenantProviderManager($app);
});
$this->app->singleton(TenantProviderManager::class, fn ($app) => $this->sprout->providers());

// Register the identity resolver manager
$this->app->singleton(IdentityResolverManager::class, function ($app) {
return new IdentityResolverManager($app);
});
$this->app->singleton(IdentityResolverManager::class, fn ($app) => $this->sprout->resolvers());

// Register the tenancy manager
$this->app->singleton(TenancyManager::class, function ($app) {
return new TenancyManager($app, $app->make(TenantProviderManager::class));
});
$this->app->singleton(TenancyManager::class, fn ($app) => $this->sprout->tenancies());

$this->app->singleton(ServiceOverrideManager::class, function ($app) {
return new ServiceOverrideManager($app, $this->sprout);
});
// Register the service override manager
$this->app->singleton(ServiceOverrideManager::class, fn ($app) => $this->sprout->overrides());

// Alias the managers with simple names
$this->app->alias(TenantProviderManager::class, 'sprout.providers');
Expand Down
Loading

0 comments on commit 7f831b9

Please sign in to comment.