From 9755bcdc10a2896d8c846bdf9f9b13367c353fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Thu, 20 Feb 2025 13:11:03 +0100 Subject: [PATCH] wip fix hardcoded values making assumptions about the parameters used in routing --- .../Integrations/FortifyRouteBootstrapper.php | 10 ++++++---- src/Bootstrappers/UrlGeneratorBootstrapper.php | 5 ++++- src/Listeners/ForgetTenantParameter.php | 2 ++ src/Overrides/TenancyUrlGenerator.php | 2 ++ src/Resolvers/PathTenantResolver.php | 5 +++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Bootstrappers/Integrations/FortifyRouteBootstrapper.php b/src/Bootstrappers/Integrations/FortifyRouteBootstrapper.php index 3e6ade1d..7da654f5 100644 --- a/src/Bootstrappers/Integrations/FortifyRouteBootstrapper.php +++ b/src/Bootstrappers/Integrations/FortifyRouteBootstrapper.php @@ -88,16 +88,17 @@ class FortifyRouteBootstrapper implements TenancyBootstrapper protected function useTenantRoutesInFortify(Tenant $tenant): void { - $tenantKey = $tenant->getTenantKey(); + // todo0 this should be just using 'tenant' and the tenant key with query identification - if we can't detect that easily, just add a static property for query id (default false) $tenantParameterName = PathTenantResolver::tenantParameterName(); + $tenantParameterValue = PathTenantResolver::tenantParameterValue($tenant); - $generateLink = function (array $redirect) use ($tenantKey, $tenantParameterName) { + $generateLink = function (array $redirect) use ($tenantParameterValue, $tenantParameterName) { // Specifying the context is only required with query string identification // because with path identification, the tenant parameter should always present $passTenantParameter = static::$passTenantParameter && $redirect['context'] === Context::TENANT; // Only pass the tenant parameter when the user should be redirected to a tenant route - return route($redirect['route_name'], $passTenantParameter ? [$tenantParameterName => $tenantKey] : []); + return route($redirect['route_name'], $passTenantParameter ? [$tenantParameterName => $tenantParameterValue] : []); }; // Get redirect URLs for the configured redirect routes @@ -108,7 +109,8 @@ class FortifyRouteBootstrapper implements TenancyBootstrapper if (static::$fortifyHome) { // Generate the home route URL with the tenant parameter and make it the Fortify home route - $this->config->set('fortify.home', route(static::$fortifyHome, [$tenantParameterName => $tenantKey])); + // todo0 this should ALSO be only when static::$passTenantParameter, otherwise [], but shouldn't we also check the context here? + $this->config->set('fortify.home', route(static::$fortifyHome, [$tenantParameterName => $tenantParameterValue])); } $this->config->set('fortify.redirects', $redirects); diff --git a/src/Bootstrappers/UrlGeneratorBootstrapper.php b/src/Bootstrappers/UrlGeneratorBootstrapper.php index 6158f22a..b5289904 100644 --- a/src/Bootstrappers/UrlGeneratorBootstrapper.php +++ b/src/Bootstrappers/UrlGeneratorBootstrapper.php @@ -69,7 +69,10 @@ class UrlGeneratorBootstrapper implements TenancyBootstrapper if (static::$addTenantParameterToDefaults) { $defaultParameters = array_merge( $defaultParameters, - [PathTenantResolver::tenantParameterName() => $tenant->getTenantKey()] + [ + PathTenantResolver::tenantParameterName() => PathTenantResolver::tenantParameterValue($tenant), // path identification + 'tenant' => $tenant->getTenantKey(), // query string identification + ], ); } diff --git a/src/Listeners/ForgetTenantParameter.php b/src/Listeners/ForgetTenantParameter.php index 424b1440..0b1d1440 100644 --- a/src/Listeners/ForgetTenantParameter.php +++ b/src/Listeners/ForgetTenantParameter.php @@ -8,6 +8,8 @@ use Illuminate\Routing\Events\RouteMatched; use Stancl\Tenancy\Enums\RouteMode; use Stancl\Tenancy\Resolvers\PathTenantResolver; +// todo@earlyIdReview + /** * Remove the tenant parameter from the matched route when path identification is used globally. * diff --git a/src/Overrides/TenancyUrlGenerator.php b/src/Overrides/TenancyUrlGenerator.php index 53798c4e..435dc9d3 100644 --- a/src/Overrides/TenancyUrlGenerator.php +++ b/src/Overrides/TenancyUrlGenerator.php @@ -152,6 +152,7 @@ class TenancyUrlGenerator extends UrlGenerator */ protected function prefixRouteName(string $name): string { + // todo0 review $tenantPrefix = PathTenantResolver::tenantRouteNamePrefix(); if (static::$prefixRouteNames && ! str($name)->startsWith($tenantPrefix)) { @@ -166,6 +167,7 @@ class TenancyUrlGenerator extends UrlGenerator */ protected function addTenantParameter(array $parameters): array { + // todo0 fix - should use tenantParameterValue(), but with query identification this should just be 'tenant', not even tenantParameterName() return tenant() && static::$passTenantParameterToRoutes ? array_merge($parameters, [PathTenantResolver::tenantParameterName() => tenant()->getTenantKey()]) : $parameters; } diff --git a/src/Resolvers/PathTenantResolver.php b/src/Resolvers/PathTenantResolver.php index 556ec4a6..ac879f45 100644 --- a/src/Resolvers/PathTenantResolver.php +++ b/src/Resolvers/PathTenantResolver.php @@ -81,6 +81,11 @@ class PathTenantResolver extends Contracts\CachedTenantResolver return config('tenancy.identification.resolvers.' . static::class . '.tenant_model_column') ?? tenancy()->model()->getTenantKeyName(); } + public static function tenantParameterValue(Tenant $tenant): string + { + return $tenant->getAttribute(static::tenantModelColumn()); + } + /** @return string[] */ public static function allowedExtraModelColumns(): array {