forked from codeigniter4/CodeIgniter4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommandRunner.php
More file actions
136 lines (110 loc) · 3.37 KB
/
Copy pathCommandRunner.php
File metadata and controls
136 lines (110 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php namespace CodeIgniter\CLI;
use CodeIgniter\Controller;
class CommandRunner extends Controller
{
/**
* Stores the info about found Commands.
*
* @var array
*/
protected $commands = [];
//--------------------------------------------------------------------
/**
* We map all un-routed CLI methods through this function
* so we have the chance to look for a Command first.
*
* @param $method
* @param array ...$params
*/
public function _remap($method, ...$params)
{
// The first param is usually empty, so scrap it.
if (empty($params[0]))
{
array_shift($params);
}
$this->index($params);
}
//--------------------------------------------------------------------
public function index(array $params)
{
$command = array_shift($params);
$this->createCommandList($command);
if (is_null($command))
{
$command = 'help';
}
return $this->runCommand($command, $params);
}
//--------------------------------------------------------------------
/**
* Actually runs the command.
*
* @param string $command
*/
protected function runCommand(string $command, array $params)
{
if (! isset($this->commands[$command]))
{
CLI::error('Command \''.$command.'\' not found');
CLI::newLine();
return;
}
// The file would have already been loaded during the
// createCommandList function...
$className = $this->commands[$command]['class'];
$class = new $className($this->logger, $this);
return $class->run($params);
}
//--------------------------------------------------------------------
/**
* Scans all Commands directories and prepares a list
* of each command with it's group and file.
*
* @return null|void
*/
protected function createCommandList()
{
$files = service('locator')->listFiles("Commands/");
// If no matching command files were found, bail
if (empty($files))
{
return;
}
// Loop over each file checking to see if a command with that
// alias exists in the class. If so, return it. Otherwise, try the next.
foreach ($files as $file)
{
$className = service('locator')->findQualifiedNameFromPath($file);
if (empty($className))
{
continue;
}
$class = new $className($this->logger, $this);
// Store it!
if ($class->group !== null)
{
$this->commands[$class->name] = [
'class' => $className,
'file' => $file,
'group' => $class->group,
'description' => $class->description
];
}
$class = null;
unset($class);
}
asort($this->commands);
}
//--------------------------------------------------------------------
/**
* Allows access to the current commands that have been found.
*
* @return array
*/
public function getCommands()
{
return $this->commands;
}
//--------------------------------------------------------------------
}