8
8
use Illuminate \Support \Arr ;
9
9
use Illuminate \Support \Str ;
10
10
use ReflectionFunction ;
11
+ use ReflectionMethod ;
11
12
12
13
class Helper
13
14
{
@@ -53,6 +54,35 @@ protected static function isItemOrderInvalid($item, $array)
53
54
return $ item ['order ' ] === false || $ item ['order ' ] >= count ($ array );
54
55
}
55
56
57
+ /**
58
+ * Gets the parameter of a callable thing (from is_callable) and returns it's arguments using reflection
59
+ *
60
+ * @param callable $callable
61
+ * @return \ReflectionParameter[]
62
+ * @throws \ReflectionException
63
+ * @throws \InvalidArgumentException
64
+ */
65
+ private static function reflectCallableParameters ($ callable )
66
+ {
67
+ /*
68
+ loosely after https://github.com/technically-php/callable-reflection/blob/main/src/CallableReflection.php#L72-L86.
69
+ Licence is compatible, both project use MIT
70
+ */
71
+ if ($ callable instanceof Closure) {
72
+ $ reflection = new ReflectionFunction ($ callable );
73
+ } else if (is_string ($ callable ) && function_exists ($ callable )) {
74
+ $ reflection = new ReflectionFunction ($ callable );
75
+ } else if (is_string ($ callable ) && str_contains ($ callable , ':: ' )) {
76
+ $ reflection = new ReflectionMethod ($ callable );
77
+ } else if (is_object ($ callable ) && method_exists ($ callable , '__invoke ' )) {
78
+ $ reflection = new ReflectionMethod ($ callable , '__invoke ' );
79
+ } else {
80
+ throw new \InvalidArgumentException ("argument is not callable or the code is wrong " );
81
+ }
82
+
83
+ return $ reflection ->getParameters ();
84
+ }
85
+
56
86
/**
57
87
* Determines if content is callable or blade string, processes and returns.
58
88
*
@@ -69,9 +99,8 @@ public static function compileContent($content, array $data, array|object $param
69
99
return static ::compileBlade ($ content , static ::getMixedValue ($ data , $ param ));
70
100
}
71
101
72
- if ($ content instanceof Closure) {
73
- $ reflection = new ReflectionFunction ($ content );
74
- $ arguments = $ reflection ->getParameters ();
102
+ if (is_callable ($ content )) {
103
+ $ arguments = self ::reflectCallableParameters ($ content );
75
104
76
105
if (count ($ arguments ) > 0 ) {
77
106
return app ()->call ($ content , [$ arguments [0 ]->name => $ param ]);
0 commit comments