From aafb8b716d28e07b8b27d2aef0449cfb41ab9a24 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Tue, 7 Aug 2018 13:18:35 +0200 Subject: [PATCH] Add ability to change redirect routes --- README.md | 9 +++++ src/Traits/RegistersUsers.php | 48 ++++++++++++++++++++++-- tests/ConfirmationTest.php | 8 +++- tests/Controllers/RegisterController.php | 6 +++ 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1fd099a..46373cd 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,15 @@ This package comes with a language file, that allows you to modify the error / c might see. In addition to that, you can change the notification class that will be used to send the confirmation code completely, by changing it in the `config/confirmation.php` file. +### Change redirect routes +You can change all possible redirect routes by including these values either as properties in your registration controller, or as methods returning the route/URL string: + +- `redirectConfirmationTo` +- `redirectAfterRegistrationTo` +- `redirectAfterResendConfirmationTo` + +They all default to `route('login')`. + ### The Confirmed Event On successful email confirmation, this package dispatches a `Confirmed` event, in order for you to conveniently handle any custom logic, such as sending a welcome email or automatically logging the user in. diff --git a/src/Traits/RegistersUsers.php b/src/Traits/RegistersUsers.php index a2bf0a8..938743a 100644 --- a/src/Traits/RegistersUsers.php +++ b/src/Traits/RegistersUsers.php @@ -12,6 +12,48 @@ trait RegistersUsers register as baseRegister; } + /** + * Get redirect path after a successful confirmation. + * + * @return string + */ + public function redirectAfterConfirmationPath() + { + if (method_exists($this, 'redirectConfirmationTo')) { + return $this->redirectConfirmationTo(); + } + + return property_exists($this, 'redirectConfirmationTo') ? $this->redirectConfirmationTo : route('login'); + } + + /** + * Get redirect path after a registration that still needs to be confirmed. + * + * @return string + */ + public function redirectAfterRegistrationPath() + { + if (method_exists($this, 'redirectAfterRegistrationTo')) { + return $this->redirectAfterRegistrationTo(); + } + + return property_exists($this, 'redirectAfterRegistrationTo') ? $this->redirectAfterRegistrationTo : route('login'); + } + + /** + * Get redirect path after the confirmation was sent. + * + * @return string + */ + public function redirectAfterResendConfirmationPath() + { + if (method_exists($this, 'redirectAfterResendConfirmationTo')) { + return $this->redirectAfterResendConfirmationTo(); + } + + return property_exists($this, 'redirectAfterResendConfirmationTo') ? $this->redirectAfterResendConfirmationTo : route('login'); + } + /** * Confirm a user with a given confirmation code. * @@ -31,7 +73,7 @@ public function confirm($confirmation_code) event(new Confirmed($user)); return $this->confirmed($user) - ?: redirect(route('login'))->with('confirmation', __('confirmation::confirmation.confirmation_successful')); + ?: redirect($this->redirectAfterConfirmationPath())->with('confirmation', __('confirmation::confirmation.confirmation_successful')); } /** @@ -47,7 +89,7 @@ public function resendConfirmation(Request $request) $user = $model->findOrFail($request->session()->pull('confirmation_user_id')); $this->sendConfirmationToUser($user); - return redirect(route('login'))->with('confirmation', __('confirmation::confirmation.confirmation_resent')); + return redirect($this->redirectAfterResendConfirmationPath())->with('confirmation', __('confirmation::confirmation.confirmation_resent')); } /** @@ -65,7 +107,7 @@ public function register(Request $request) $this->sendConfirmationToUser($user); return $this->registered($request, $user) - ?: redirect(route('login'))->with('confirmation', __('confirmation::confirmation.confirmation_info')); + ?: redirect($this->redirectAfterRegistrationPath())->with('confirmation', __('confirmation::confirmation.confirmation_info')); } /** diff --git a/tests/ConfirmationTest.php b/tests/ConfirmationTest.php index d04f5fd..18c0738 100644 --- a/tests/ConfirmationTest.php +++ b/tests/ConfirmationTest.php @@ -28,6 +28,8 @@ public function it_adds_confirmation_codes_to_registered_users() $this->assertNull($user->confirmed_at); $this->assertNotNull($user->confirmation_code); + $response->assertRedirect('redirectAfterRegistration'); + $response->assertSessionHas('confirmation', __('confirmation::confirmation.confirmation_info')); Notification::assertSentTo($user, ConfirmEmail::class); @@ -90,6 +92,8 @@ public function it_can_resend_confirmation_codes() $response->assertSessionHas('confirmation', __('confirmation::confirmation.confirmation_resent')); + $response->assertRedirect('redirectAfterConfirmationResent'); + Notification::assertSentTo($user, ConfirmEmail::class); } @@ -109,7 +113,7 @@ public function it_can_confirm_valid_codes() $response->assertSessionHas('confirmation', __('confirmation::confirmation.confirmation_successful')); - $response->assertRedirect('/login'); + $response->assertRedirect('/redirectConfirmationUrl'); } /** @test */ @@ -162,7 +166,7 @@ public function it_dispatches_confirmed_event_on_successful_confirmation() return $e->user->email === $user->email; }); - $response->assertRedirect('/login'); + $response->assertRedirect('/redirectConfirmationUrl'); } /** @test */ diff --git a/tests/Controllers/RegisterController.php b/tests/Controllers/RegisterController.php index 48930e5..67a51a2 100644 --- a/tests/Controllers/RegisterController.php +++ b/tests/Controllers/RegisterController.php @@ -24,6 +24,12 @@ class RegisterController extends Controller */ use AuthorizesRequests, DispatchesJobs, ValidatesRequests, RegistersUsers; + protected $redirectConfirmationTo = 'redirectConfirmationUrl'; + + protected $redirectAfterRegistrationTo = 'redirectAfterRegistration'; + + protected $redirectAfterResendConfirmationTo = 'redirectAfterConfirmationResent'; + /** * Get a validator for an incoming registration request. *