Extension   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 55
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 55
rs 10
c 0
b 0
f 0
wmc 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
A afterCompile() 0 10 3
A loadConfiguration() 0 27 2
1
<?php
2
3
namespace Rostenkowski\Console;
4
5
6
use Nette\DI\CompilerExtension;
7
use Nette\DI\Helpers;
8
use Nette\PhpGenerator;
9
use Rostenkowski\Console\Command\DebugRouter;
10
use Symfony\Component\Console\Application;
11
use Symfony\Component\Console\Command\Command;
12
13
class Extension extends CompilerExtension
14
{
15
16
	protected $defaults = [
17
		'debugMode' => '%debugMode%',
18
		'class'     => Application::class,
19
		'name'      => 'app console',
20
		'version'   => '1.0.0',
21
		'commands'  => [
22
			'debug:router' => DebugRouter::class
23
		],
24
	];
25
26
27
	public function loadConfiguration()
28
	{
29
		$builder = $this->getContainerBuilder();
30
31
		// expand options
32
		$config = Helpers::expand($this->validateConfig($this->defaults, $this->getConfig()), $builder->parameters);
33
34
		// create console
35
		$console = $builder->addDefinition('console')
36
			->setClass($config['class'])
37
			->addSetup('setCatchExceptions', [$config['debugMode']])
38
			->addSetup('setName', [$config['name']])
39
			->addSetup('setVersion', [$config['version']]);
40
41
		// add commands
42
		foreach ($config['commands'] as $name => $class) {
43
44
			// remove backslashes from the class name
45
			$serviceName = preg_replace('/\\\\/', '', $class);
46
47
			// create command
48
			$command = $builder->addDefinition($this->prefix($serviceName));
49
			$command->setFactory($class);
50
			$command->addSetup('setName', [$name]);
51
52
			// add command to console
53
			$console->addSetup('add', [$this->prefix("@$serviceName")]);
54
		}
55
	}
56
57
58
	public function afterCompile(PhpGenerator\ClassType $class)
59
	{
60
		// add all commands defined as services
61
		$builder = $this->getContainerBuilder();
62
		$console = $builder->getDefinition($builder->getByType(Application::class));
63
		foreach ($builder->findByType(Command::class) as $name => $definition) {
64
65
			// already registered commands are marked with console tag
66
			if (!$definition->getTag('console')) {
67
				$console->addSetup('add', ['@name']);
68
			}
69
		}
70
	}
71
72
73
}
74