1 | <?php |
||
10 | class Runner |
||
11 | { |
||
12 | private $app; |
||
13 | private $mapping; |
||
14 | |||
15 | 8 | public function __construct(Application $app) |
|
16 | { |
||
17 | 8 | $this->app = $app; |
|
18 | 8 | } |
|
19 | |||
20 | 8 | public function getMapping() |
|
21 | { |
||
22 | 8 | if (!$this->mapping) { |
|
23 | 8 | $jobs = []; |
|
24 | 8 | foreach ($this->app->get(Framework::class)->listClasses('Job') as $class) { |
|
25 | 8 | $jobs[substr($class, strlen('Basis\\Job\\'))] = $class; |
|
26 | } |
||
27 | 8 | $serviceName = ucfirst($this->app->get(Config::class)['service']); |
|
28 | 8 | foreach ($this->app->get(Filesystem::class)->listClasses('Job') as $class) { |
|
29 | 8 | $jobs[$serviceName.'\\'.substr($class, strlen('Job\\'))] = $class; |
|
30 | 8 | $jobs[substr($class, strlen('Job\\'))] = $class; |
|
31 | } |
||
32 | |||
33 | |||
34 | 8 | foreach ($jobs as $part => $class) { |
|
35 | 8 | $nick = str_replace('\\', '.', $part); |
|
36 | 8 | $jobs[$nick] = $class; |
|
37 | 8 | $jobs[strtolower($nick)] = $class; |
|
38 | } |
||
39 | |||
40 | 8 | $this->mapping = $jobs; |
|
41 | } |
||
42 | |||
43 | 8 | return $this->mapping; |
|
44 | } |
||
45 | |||
46 | 8 | public function hasJob($nick) |
|
47 | { |
||
48 | 8 | return array_key_exists($nick, $this->getMapping()); |
|
49 | } |
||
50 | |||
51 | 8 | public function getJobClass($nick) |
|
52 | { |
||
53 | 8 | $mapping = $this->getMapping(); |
|
54 | 8 | if (!array_key_exists($nick, $mapping)) { |
|
55 | throw new LogicException("No job $nick"); |
||
56 | } |
||
57 | |||
58 | 8 | $class = $mapping[$nick]; |
|
59 | |||
60 | 8 | if (!class_exists($class)) { |
|
61 | throw new LogicException("No class for job $nick"); |
||
62 | } |
||
63 | 8 | return $class; |
|
64 | } |
||
65 | |||
66 | 8 | public function dispatch($nick, $arguments = []) |
|
67 | { |
||
68 | 8 | $class = $this->getJobClass($nick); |
|
69 | |||
70 | 8 | $instance = $this->app->get($class); |
|
71 | 8 | if (array_key_exists(0, $arguments)) { |
|
72 | 1 | $arguments = $this->castArguments($class, $arguments); |
|
73 | } |
||
74 | |||
75 | 8 | foreach ($arguments as $k => $v) { |
|
76 | 4 | $instance->$k = $v; |
|
77 | } |
||
78 | |||
79 | 8 | return $this->app->call([$instance, 'run']); |
|
80 | } |
||
81 | |||
82 | 1 | private function castArguments($class, $arguments) |
|
95 | } |
||
96 |