diff --git a/src/Http/Responses/SimpleViewResponse.php b/src/Http/Responses/SimpleViewResponse.php index 3ba48b33..12e435e1 100644 --- a/src/Http/Responses/SimpleViewResponse.php +++ b/src/Http/Responses/SimpleViewResponse.php @@ -2,6 +2,7 @@ namespace Laravel\Fortify\Http\Responses; +use Illuminate\Contracts\Support\Responsable; use Laravel\Fortify\Contracts\ConfirmPasswordViewResponse; use Laravel\Fortify\Contracts\LoginViewResponse; use Laravel\Fortify\Contracts\RegisterViewResponse; @@ -45,8 +46,16 @@ public function __construct($view) */ public function toResponse($request) { - return is_callable($this->view) && ! is_string($this->view) - ? call_user_func($this->view, $request) - : view($this->view, ['request' => $request]); + if (! is_callable($this->view) || is_string($this->view)) { + return view($this->view, ['request' => $request]); + } + + $response = call_user_func($this->view, $request); + + if ($response instanceof Responsable) { + return $response->toResponse($request); + } + + return $response; } } diff --git a/tests/FortifyServiceProviderTest.php b/tests/FortifyServiceProviderTest.php new file mode 100644 index 00000000..e0234a2f --- /dev/null +++ b/tests/FortifyServiceProviderTest.php @@ -0,0 +1,39 @@ +get('/login'); + + $response->assertOk(); + $this->assertSame('foo', $response->content()); + } + + public function test_customized_views_can_return_their_own_responsable() + { + Fortify::loginView(function () { + return new class implements Responsable { + public function toResponse($request) + { + return new JsonResponse(['foo' => 'bar']); + } + }; + }); + + $response = $this->get('/login'); + + $response->assertOk(); + $response->assertExactJson(['foo' => 'bar']); + } +}