From c7a2d041580c1fa2b440795ec5cbe6d6e363c637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= Date: Tue, 17 Jun 2025 22:02:56 +0200 Subject: [PATCH 1/4] refactor(helpers): :recycle: Make class_uses_recursive() and trait_uses_recursive() helpers onceable --- src/Illuminate/Database/Eloquent/Model.php | 6 ++-- src/Illuminate/Support/helpers.php | 42 ++++++++++++---------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Model.php b/src/Illuminate/Database/Eloquent/Model.php index 52b3998008fe..75f398bd07b2 100644 --- a/src/Illuminate/Database/Eloquent/Model.php +++ b/src/Illuminate/Database/Eloquent/Model.php @@ -2294,7 +2294,7 @@ public function setPerPage($perPage) */ public static function isSoftDeletable(): bool { - return in_array(SoftDeletes::class, class_uses_recursive(static::class)); + return in_array(SoftDeletes::class, class_uses_recursive(static::class, true)); } /** @@ -2302,7 +2302,7 @@ public static function isSoftDeletable(): bool */ protected function isPrunable(): bool { - return in_array(Prunable::class, class_uses_recursive(static::class)) || static::isMassPrunable(); + return in_array(Prunable::class, class_uses_recursive(static::class, true)) || static::isMassPrunable(); } /** @@ -2310,7 +2310,7 @@ protected function isPrunable(): bool */ protected function isMassPrunable(): bool { - return in_array(MassPrunable::class, class_uses_recursive(static::class)); + return in_array(MassPrunable::class, class_uses_recursive(static::class, true)); } /** diff --git a/src/Illuminate/Support/helpers.php b/src/Illuminate/Support/helpers.php index 8ecb1eb3cffe..f1275739877e 100644 --- a/src/Illuminate/Support/helpers.php +++ b/src/Illuminate/Support/helpers.php @@ -100,19 +100,22 @@ function class_basename($class) * @param object|string $class * @return array */ - function class_uses_recursive($class) + function class_uses_recursive($class, bool $cache = false) { - if (is_object($class)) { - $class = get_class($class); - } - - $results = []; - - foreach (array_reverse(class_parents($class) ?: []) + [$class => $class] as $class) { - $results += trait_uses_recursive($class); - } - - return array_unique($results); + $callback = function () use ($class, $cache) { + if (is_object($class)) { + $class = get_class($class); + } + + $results = []; + + foreach (array_reverse(class_parents($class) ?: []) + [$class => $class] as $class) { + $results += trait_uses_recursive($class, $cache); + } + + return array_unique($results); + }; + return $cache ? once($callback) : call_user_func($callback); } } @@ -459,15 +462,18 @@ function throw_unless($condition, $exception = 'RuntimeException', ...$parameter * @param object|string $trait * @return array */ - function trait_uses_recursive($trait) + function trait_uses_recursive($trait, bool $cache = false) { - $traits = class_uses($trait) ?: []; + $callback = function () use ($trait) { + $traits = class_uses($trait) ?: []; - foreach ($traits as $trait) { - $traits += trait_uses_recursive($trait); - } + foreach ($traits as $trait) { + $traits += trait_uses_recursive($trait); + } - return $traits; + return $traits; + }; + return $cache ? once($callback) : call_user_func($callback); } } From 83d1d51ddd5cdc883e8e06deef188a16525ae6d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= Date: Tue, 17 Jun 2025 22:08:18 +0200 Subject: [PATCH 2/4] style(helpers): :art: StyleCI Co-authored-by: Luke Kuzmish See https://github.styleci.io/analyses/xgkx70?utm_campaign=vcs-integration-link&utm_medium=referral&utm_source=github-build-link --- src/Illuminate/Support/helpers.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Support/helpers.php b/src/Illuminate/Support/helpers.php index f1275739877e..c79809c0ea09 100644 --- a/src/Illuminate/Support/helpers.php +++ b/src/Illuminate/Support/helpers.php @@ -106,15 +106,16 @@ function class_uses_recursive($class, bool $cache = false) if (is_object($class)) { $class = get_class($class); } - + $results = []; - + foreach (array_reverse(class_parents($class) ?: []) + [$class => $class] as $class) { $results += trait_uses_recursive($class, $cache); } - + return array_unique($results); }; + return $cache ? once($callback) : call_user_func($callback); } } @@ -473,6 +474,7 @@ function trait_uses_recursive($trait, bool $cache = false) return $traits; }; + return $cache ? once($callback) : call_user_func($callback); } } From 9169927393d2c924b6e7d7b23892565203a0ff4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Wed, 18 Jun 2025 10:49:34 +0200 Subject: [PATCH 3/4] Pass through $cache flag to recursive calls Co-authored-by: Wes Hooper Co-authored-by: Wes Hooper --- src/Illuminate/Support/helpers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Support/helpers.php b/src/Illuminate/Support/helpers.php index c79809c0ea09..51799e28f751 100644 --- a/src/Illuminate/Support/helpers.php +++ b/src/Illuminate/Support/helpers.php @@ -465,7 +465,7 @@ function throw_unless($condition, $exception = 'RuntimeException', ...$parameter */ function trait_uses_recursive($trait, bool $cache = false) { - $callback = function () use ($trait) { + $callback = function () use ($trait, $cache) { $traits = class_uses($trait) ?: []; foreach ($traits as $trait) { From 879ee21ee6d08c7355c893a306a56b9ce65a7bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=A4drich?= <11225821+shaedrich@users.noreply.github.com> Date: Wed, 18 Jun 2025 10:49:52 +0200 Subject: [PATCH 4/4] Pass through $cache flag to recursive calls Co-authored-by: Wes Hooper Co-authored-by: Wes Hooper --- src/Illuminate/Support/helpers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Support/helpers.php b/src/Illuminate/Support/helpers.php index 51799e28f751..8d55c3cdae19 100644 --- a/src/Illuminate/Support/helpers.php +++ b/src/Illuminate/Support/helpers.php @@ -469,7 +469,7 @@ function trait_uses_recursive($trait, bool $cache = false) $traits = class_uses($trait) ?: []; foreach ($traits as $trait) { - $traits += trait_uses_recursive($trait); + $traits += trait_uses_recursive($trait, $cache); } return $traits;