3
3
4
4
/**
5
5
* Class AsyncExecuteTask
6
+ *
7
+ * @property object $instance Class instance to execute against
8
+ * @property string $class Class to call. Not required if [[instance]] specified
9
+ * @property string $method Class or instance method to call
10
+ * @property array $arguments Associative array of method's arguments
6
11
*/
7
12
class AsyncExecuteTask extends AsyncTask
8
13
{
9
- function __sleep ()
10
- {
11
- return $ this ->attributeNames ();
12
- }
13
-
14
+ public $ instance ;
14
15
public $ class ;
15
16
public $ method ;
16
17
public $ arguments = [];
17
18
18
19
public function rules ()
19
20
{
20
21
return array (
21
- [['class ' , 'method ' , 'arguments ' ], 'required ' ],
22
+ [['instance ' ], 'validateInstance ' ],
23
+ [['class ' , 'method ' ], 'required ' ],
22
24
[['class ' , 'method ' ], 'string ' ],
23
25
[['class ' ], 'validateClass ' ],
24
26
[['method ' ], 'validateMethod ' ],
25
27
[['arguments ' ], 'validateArguments ' ],
26
28
);
27
29
}
28
30
31
+ private function getIsClassValid ()
32
+ {
33
+ return class_exists ($ this ->class );
34
+ }
35
+
36
+ public function validateInstance ($ attribute , $ params )
37
+ {
38
+ if (empty ($ this ->$ attribute )) {
39
+ return ;
40
+ }
41
+
42
+ if (!is_object ($ this ->$ attribute )) {
43
+ $ this ->addError ($ attribute , "Instance should be an object, not a " . gettype ($ this ->$ attribute ));
44
+ return ;
45
+ }
46
+
47
+ $ this ->class = get_class ($ this ->$ attribute );
48
+ }
49
+
29
50
public function validateClass ($ attribute , $ params )
30
51
{
31
- if (!class_exists ( $ this ->$ attribute )) {
52
+ if (!$ this ->getIsClassValid ( )) {
32
53
$ this ->addError ($ attribute , "Class {$ this ->$ attribute } does not exist " );
33
54
}
34
55
}
35
56
36
57
public function validateMethod ($ attribute , $ params )
37
58
{
38
- if (!class_exists ($ this ->class )) {
39
- $ this ->addError ($ attribute , "Class {$ this ->$ attribute } does not exist " );
59
+ if (!$ this ->getIsClassValid ()) {
40
60
return ;
41
61
}
42
62
@@ -50,8 +70,7 @@ public function validateMethod($attribute, $params)
50
70
51
71
public function validateArguments ($ attribute , $ params )
52
72
{
53
- if (!class_exists ($ this ->class )) {
54
- $ this ->addError ($ attribute , "Class {$ this ->$ attribute } does not exist " );
73
+ if (!$ this ->getIsClassValid ()) {
55
74
return ;
56
75
}
57
76
@@ -69,6 +88,21 @@ public function validateArguments($attribute, $params)
69
88
foreach ($ refFunc ->getParameters () as $ param ) {
70
89
if (!$ param ->isOptional () && !in_array ($ param ->getName (), $ userArguments )) {
71
90
$ missingArguments [] = $ param ->getName ();
91
+ } else {
92
+ // Type hint
93
+ // Notice that array hinting is not supported yet
94
+ if ($ param ->getClass ()
95
+ && (
96
+ !is_object ($ this ->{$ attribute }[$ param ->getName ()])
97
+ || get_class ($ this ->{$ attribute }[$ param ->getName ()]) !== $ param ->getClass ()->name
98
+ )
99
+ ) {
100
+ $ this ->addError (
101
+ $ attribute ,
102
+ "Method ` {$ this ->method }` param ` {$ param ->getName ()}` " .
103
+ "expects type ` {$ param ->getClass ()->name }` but got " . gettype ($ this ->{$ attribute }[$ param ->getName ()])
104
+ );
105
+ }
72
106
}
73
107
}
74
108
@@ -90,6 +124,7 @@ public function validateArguments($attribute, $params)
90
124
public function attributeNames ()
91
125
{
92
126
return [
127
+ 'instance ' ,
93
128
'class ' ,
94
129
'method ' ,
95
130
'arguments '
@@ -103,6 +138,15 @@ static function nope($return)
103
138
104
139
public function execute ()
105
140
{
106
- return call_user_func_array (array ($ this ->class , $ this ->method ), $ this ->arguments );
141
+ if ($ this ->instance ) {
142
+ return call_user_func_array (array ($ this ->instance , $ this ->method ), $ this ->arguments );
143
+ } else {
144
+ return call_user_func_array (array ($ this ->class , $ this ->method ), $ this ->arguments );
145
+ }
146
+ }
147
+
148
+ function __sleep ()
149
+ {
150
+ return $ this ->attributeNames ();
107
151
}
108
152
}
0 commit comments