From c010c51592f900347602d9096806ff45b09d71c6 Mon Sep 17 00:00:00 2001 From: Sam Feyaerts Date: Fri, 16 Feb 2024 12:13:29 +0100 Subject: [PATCH 1/2] feat: add url signing macros to `UrlGenerator` --- src/Macros/UrlGeneratorMacros.php | 44 ++++++++++++++++++++++ src/MultilingualRoutesServiceProvider.php | 3 ++ tests/UrlTest.php | 46 +++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 src/Macros/UrlGeneratorMacros.php create mode 100644 tests/UrlTest.php diff --git a/src/Macros/UrlGeneratorMacros.php b/src/Macros/UrlGeneratorMacros.php new file mode 100644 index 0000000..c8280d0 --- /dev/null +++ b/src/Macros/UrlGeneratorMacros.php @@ -0,0 +1,44 @@ +signedLocalizedRoute($name, $parameters, $expiration, $absolute); + }; + } + + /** + * Create a signed route URL for a named route in the current + * locale. + * + * @param string $name + * @param mixed $parameters + * @param \DateTimeInterface|\DateInterval|int|null $expiration + * @param bool $absolute + * @return string + * + * @throws \InvalidArgumentException + */ + public function signedLocalizedRoute() + { + return function ($name, $parameters = [], $expiration = null, $absolute = true) { + return $this->signedRoute(locale().".{$name}", $parameters, $expiration, $absolute); + }; + } +} diff --git a/src/MultilingualRoutesServiceProvider.php b/src/MultilingualRoutesServiceProvider.php index 963f222..5997579 100644 --- a/src/MultilingualRoutesServiceProvider.php +++ b/src/MultilingualRoutesServiceProvider.php @@ -5,8 +5,10 @@ use ChinLeung\MultilingualRoutes\Macros\RedirectorMacros; use ChinLeung\MultilingualRoutes\Macros\RequestMacros; use ChinLeung\MultilingualRoutes\Macros\RouterMacros; +use ChinLeung\MultilingualRoutes\Macros\UrlGeneratorMacros; use Illuminate\Http\Request; use Illuminate\Routing\Router; +use Illuminate\Routing\UrlGenerator; use Illuminate\Support\Facades\Redirect; use Illuminate\Support\ServiceProvider; @@ -22,6 +24,7 @@ public function boot(): void Redirect::mixin(new RedirectorMacros); Request::mixin(new RequestMacros); Router::mixin(new RouterMacros); + UrlGenerator::mixin(new UrlGeneratorMacros); require __DIR__.'/helpers.php'; diff --git a/tests/UrlTest.php b/tests/UrlTest.php new file mode 100644 index 0000000..c644b6e --- /dev/null +++ b/tests/UrlTest.php @@ -0,0 +1,46 @@ + [ + 'en', 'fr', + ]]); + } + + /** @test **/ + public function a_multilingual_route_can_be_signed(): void + { + Route::multilingual('test'); + + $request = Request::create(URL::signedLocalizedRoute('test')); + + $this->assertTrue(URL::hasValidSignature($request)); + $this->assertTrue(str_starts_with($request->url(), localized_route('test'))); + } + + /** @test **/ + public function a_multilingual_route_can_be_signed_with_temporary_signature(): void + { + Route::multilingual('test'); + + $request = Request::create(URL::temporarySignedLocalizedRoute('test', now()->addMinutes(30))); + + $this->assertTrue(URL::hasValidSignature($request)); + $this->assertTrue(str_starts_with($request->url(), localized_route('test'))); + + $this->travel(5)->hours(); + + $this->assertFalse(URL::hasValidSignature($request)); + } +} From 400b0f23857082ff36fc010353ea844e1a4188ef Mon Sep 17 00:00:00 2001 From: Sam Feyaerts Date: Fri, 16 Feb 2024 12:13:44 +0100 Subject: [PATCH 2/2] docs: update readme for url signing --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 812dfb0..39b4e97 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,13 @@ Route::multilingual('contact')->redirect('support'); Request::localizedRouteIs('home'); ``` +### Signing localized routes + +```php +URL::signedLocalizedRoute('unsubscribe', ['user' => 1]); +URL::temporarySignedLocalizedRoute('unsubscribe', now()->addMinutes(30), ['user' => 1]); +``` + ## Upgrading from 1.x to 2.x To update from 1.x to 2.x, you simply have to rename the namespace occurrences in your application from `LaravelMultilingualRoutes` to `MultilingualRoutes`. The most common use case would be the `DetectRequestLocale` middleware.