From 6d24530a97a71330ce1e01667d1c5b12e8dedae1 Mon Sep 17 00:00:00 2001 From: Allan Mariucci Carvalho Date: Mon, 23 Sep 2024 13:28:44 -0300 Subject: [PATCH 1/4] wip --- .../Middleware/InvokeDeferredCallbacks.php | 5 ++++- .../Support/Defer/DeferredCallback.php | 21 +++++++++++++++++-- src/Illuminate/Support/functions.php | 4 ++-- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php index 9e31e026c87..0650d5a3a7b 100644 --- a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php +++ b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php @@ -6,6 +6,7 @@ use Illuminate\Container\Container; use Illuminate\Http\Request; use Illuminate\Support\Defer\DeferredCallbackCollection; +use Illuminate\Support\Facades\Session; use Symfony\Component\HttpFoundation\Response; class InvokeDeferredCallbacks @@ -31,8 +32,10 @@ public function handle(Request $request, Closure $next) */ public function terminate(Request $request, Response $response) { + $hasErrors = session()?->has('errors') ?? false; Container::getInstance() ->make(DeferredCallbackCollection::class) - ->invokeWhen(fn ($callback) => $response->getStatusCode() < 400 || $callback->always); + ->invokeWhen(fn($callback) => ($response->getStatusCode() < 400 || $callback->always) + && (!$hasErrors) || $callback->evenWithErrors); } } diff --git a/src/Illuminate/Support/Defer/DeferredCallback.php b/src/Illuminate/Support/Defer/DeferredCallback.php index 2bf6ad4cbd1..574c26da518 100644 --- a/src/Illuminate/Support/Defer/DeferredCallback.php +++ b/src/Illuminate/Support/Defer/DeferredCallback.php @@ -12,8 +12,12 @@ class DeferredCallback * @param callable $callback * @return void */ - public function __construct(public $callback, public ?string $name = null, public bool $always = false) - { + public function __construct( + public $callback, + public ?string $name = null, + public bool $always = false, + public bool $evenWithErrors = true, + ) { $this->name = $name ?? (string) Str::uuid(); } @@ -43,6 +47,19 @@ public function always(bool $always = true): self return $this; } + /** + * Indicate that the deferred callback should run even on unsuccessful requests validations. + * + * @param bool $evenWithErrors + * @return $this + */ + public function evenWithErrors(bool $evenWithErrors = true): self + { + $this->evenWithErrors = $evenWithErrors; + + return $this; + } + /** * Invoke the deferred callback. * diff --git a/src/Illuminate/Support/functions.php b/src/Illuminate/Support/functions.php index 2472dfafff9..2c8af3f640d 100644 --- a/src/Illuminate/Support/functions.php +++ b/src/Illuminate/Support/functions.php @@ -14,14 +14,14 @@ * @param bool $always * @return \Illuminate\Support\Defer\DeferredCallback */ -function defer(?callable $callback = null, ?string $name = null, bool $always = false) +function defer(?callable $callback = null, ?string $name = null, bool $always = false, $evenWithErrors = true) { if ($callback === null) { return app(DeferredCallbackCollection::class); } return tap( - new DeferredCallback($callback, $name, $always), + new DeferredCallback($callback, $name, $always, $evenWithErrors), fn ($deferred) => app(DeferredCallbackCollection::class)[] = $deferred ); } From ad4f74d90904b6c6bd53f22042b765295ea94310 Mon Sep 17 00:00:00 2001 From: Allan Mariucci Carvalho Date: Mon, 23 Sep 2024 13:30:59 -0300 Subject: [PATCH 2/4] cleanup --- .../Foundation/Http/Middleware/InvokeDeferredCallbacks.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php index 0650d5a3a7b..b6b1fd13c60 100644 --- a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php +++ b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php @@ -6,7 +6,6 @@ use Illuminate\Container\Container; use Illuminate\Http\Request; use Illuminate\Support\Defer\DeferredCallbackCollection; -use Illuminate\Support\Facades\Session; use Symfony\Component\HttpFoundation\Response; class InvokeDeferredCallbacks From 114c5aa358851802f80d68c98db1eabd7d935d60 Mon Sep 17 00:00:00 2001 From: Allan Mariucci Carvalho Date: Mon, 23 Sep 2024 14:50:42 -0300 Subject: [PATCH 3/4] some fixes and improvements --- .../Foundation/Http/Middleware/InvokeDeferredCallbacks.php | 7 ++++--- src/Illuminate/Foundation/helpers.php | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php index b6b1fd13c60..1ac3f33c415 100644 --- a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php +++ b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php @@ -4,6 +4,7 @@ use Closure; use Illuminate\Container\Container; +use Illuminate\Contracts\Session\Session; use Illuminate\Http\Request; use Illuminate\Support\Defer\DeferredCallbackCollection; use Symfony\Component\HttpFoundation\Response; @@ -31,10 +32,10 @@ public function handle(Request $request, Closure $next) */ public function terminate(Request $request, Response $response) { - $hasErrors = session()?->has('errors') ?? false; + $hasErrors = $request->hasSession() && $request->session()->has('errors'); Container::getInstance() ->make(DeferredCallbackCollection::class) - ->invokeWhen(fn($callback) => ($response->getStatusCode() < 400 || $callback->always) - && (!$hasErrors) || $callback->evenWithErrors); + ->invokeWhen(fn ($callback) => ($response->getStatusCode() < 400 || $callback->always) + && (! $hasErrors || $callback->evenWithErrors)); } } diff --git a/src/Illuminate/Foundation/helpers.php b/src/Illuminate/Foundation/helpers.php index 09224da3e68..2fc95b73781 100644 --- a/src/Illuminate/Foundation/helpers.php +++ b/src/Illuminate/Foundation/helpers.php @@ -408,9 +408,9 @@ function decrypt($value, $unserialize = true) * @param bool $always * @return \Illuminate\Foundation\Defer\DeferredCallback */ - function defer(?callable $callback = null, ?string $name = null, bool $always = false) + function defer(?callable $callback = null, ?string $name = null, bool $always = false, $evenWithErrors = true) { - return \Illuminate\Support\defer($callback, $name, $always); + return \Illuminate\Support\defer($callback, $name, $always, $evenWithErrors); } } From 0182390e497e4ffe54c72997d0e8f883590bc682 Mon Sep 17 00:00:00 2001 From: Allan Mariucci Carvalho Date: Mon, 23 Sep 2024 14:51:29 -0300 Subject: [PATCH 4/4] removed unnecessary import --- .../Foundation/Http/Middleware/InvokeDeferredCallbacks.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php index 1ac3f33c415..2098a7803a4 100644 --- a/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php +++ b/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php @@ -4,7 +4,6 @@ use Closure; use Illuminate\Container\Container; -use Illuminate\Contracts\Session\Session; use Illuminate\Http\Request; use Illuminate\Support\Defer\DeferredCallbackCollection; use Symfony\Component\HttpFoundation\Response;