Skip to content

Commit

Permalink
[4.x] Improve RootUrl and UrlGenerator bootstrappers (#1294)
Browse files Browse the repository at this point in the history
* Make RootUrlBootstrapper run ONLY in CLI by default (add $rootUrlOverrideInTests), work with resolved UrlGenerator

* Make resolving 'url' return a pre-created generator instance instead of creating it on every app('url') call

* Take care of doubling tenant keys in TenancyUrlGenerator, add regression test for using UrlGenerator and RootUrl bootstrappers together

* Fix code style (php-cs-fixer)

* refactor RootUrlBootstrapper

* add docblock

* clarify docblock

* simplify test: use concrete values instead of overly dynamic code

* Fix bootstrapper order in test, add url('/') assertion

* Use $this->app instead of app()

* Improve TenancyUrlGenerator and RootUrlBootstrapperTest clarity

* Revert attempt to maintain compatibility between the two bootstrappers

* Delete bootstrapper combining test

* Fix code style (php-cs-fixer)

---------

Co-authored-by: lukinovec <[email protected]>
Co-authored-by: PHP CS Fixer <[email protected]>
  • Loading branch information
3 people authored Jan 16, 2025
1 parent 8f958d5 commit 5d3b3d3
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 25 deletions.
33 changes: 25 additions & 8 deletions src/Bootstrappers/RootUrlBootstrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use Closure;
use Illuminate\Config\Repository;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Routing\UrlGenerator;
use Stancl\Tenancy\Contracts\TenancyBootstrapper;
use Stancl\Tenancy\Contracts\Tenant;

Expand Down Expand Up @@ -36,28 +35,46 @@ class RootUrlBootstrapper implements TenancyBootstrapper

protected string|null $originalRootUrl = null;

/**
* You may want to selectively enable or disable this bootstrapper in specific tests.
* For instance, when using `Livewire::test()` this bootstrapper can cause problems,
* due to an internal Livewire route, so you may want to disable it, while in tests
* that are generating URLs in things like mails, the bootstrapper should be used
* just like in any queued job.
*/
public static bool $rootUrlOverrideInTests = false;

public function __construct(
protected UrlGenerator $urlGenerator,
protected Repository $config,
protected Application $app,
) {}

public function bootstrap(Tenant $tenant): void
{
if ($this->app->runningInConsole() && static::$rootUrlOverride) {
$this->originalRootUrl = $this->urlGenerator->to('/');
if (static::$rootUrlOverride === null) {
return;
}

$newRootUrl = (static::$rootUrlOverride)($tenant, $this->originalRootUrl);
if (! $this->app->runningInConsole()) {
return;
}

$this->urlGenerator->forceRootUrl($newRootUrl);
$this->config->set('app.url', $newRootUrl);
if ($this->app->runningUnitTests() && ! static::$rootUrlOverrideInTests) {
return;
}

$this->originalRootUrl = $this->app['url']->to('/');

$newRootUrl = (static::$rootUrlOverride)($tenant, $this->originalRootUrl);

$this->app['url']->forceRootUrl($newRootUrl);
$this->config->set('app.url', $newRootUrl);
}

public function revert(): void
{
if ($this->originalRootUrl) {
$this->urlGenerator->forceRootUrl($this->originalRootUrl);
$this->app['url']->forceRootUrl($this->originalRootUrl);
$this->config->set('app.url', $this->originalRootUrl);
}
}
Expand Down
30 changes: 14 additions & 16 deletions src/Bootstrappers/UrlGeneratorBootstrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public function bootstrap(Tenant $tenant): void

public function revert(): void
{
$this->app->bind('url', fn () => $this->originalUrlGenerator);
$this->app->extend('url', fn () => $this->originalUrlGenerator);
}

/**
Expand All @@ -47,24 +47,22 @@ public function revert(): void
*/
protected function useTenancyUrlGenerator(): void
{
$this->app->extend('url', function (UrlGenerator $urlGenerator, Application $app) {
$newGenerator = new TenancyUrlGenerator(
$app['router']->getRoutes(),
$urlGenerator->getRequest(),
$app['config']->get('app.asset_url'),
);
$newGenerator = new TenancyUrlGenerator(
$this->app['router']->getRoutes(),
$this->originalUrlGenerator->getRequest(),
$this->app['config']->get('app.asset_url'),
);

$newGenerator->defaults($urlGenerator->getDefaultParameters());
$newGenerator->defaults($this->originalUrlGenerator->getDefaultParameters());

$newGenerator->setSessionResolver(function () {
return $this->app['session'] ?? null;
});

$newGenerator->setKeyResolver(function () {
return $this->app->make('config')->get('app.key');
});
$newGenerator->setSessionResolver(function () {
return $this->app['session'] ?? null;
});

return $newGenerator;
$newGenerator->setKeyResolver(function () {
return $this->app->make('config')->get('app.key');
});

$this->app->extend('url', fn () => $newGenerator);
}
}
7 changes: 6 additions & 1 deletion tests/Bootstrappers/RootUrlBootstrapperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,23 @@
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Bootstrappers\RootUrlBootstrapper;
use Stancl\Tenancy\Middleware\InitializeTenancyBySubdomain;
use Stancl\Tenancy\Bootstrappers\UrlGeneratorBootstrapper;
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
use Stancl\Tenancy\Overrides\TenancyUrlGenerator;

beforeEach(function () {
Event::listen(TenancyInitialized::class, BootstrapTenancy::class);
Event::listen(TenancyEnded::class, RevertToCentralContext::class);
RootUrlBootstrapper::$rootUrlOverride = null;
RootUrlBootstrapper::$rootUrlOverrideInTests = true;
});

afterEach(function () {
RootUrlBootstrapper::$rootUrlOverride = null;
RootUrlBootstrapper::$rootUrlOverrideInTests = false;
});

test('root url bootstrapper overrides the root url when tenancy gets initialized and reverts the url to the central one after tenancy ends', function() {
test('root url bootstrapper overrides the root url when tenancy gets initialized and reverts the url to the central one when ending tenancy', function() {
config(['tenancy.bootstrappers' => [RootUrlBootstrapper::class]]);

Route::group([
Expand Down

0 comments on commit 5d3b3d3

Please sign in to comment.