Passed
Push — master ( a2340d...9d7d2b )
by butschster
06:32
created

ScaffolderBootloader   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 97
Duplicated Lines 0 %

Test Coverage

Coverage 96.43%

Importance

Changes 0
Metric Value
wmc 4
eloc 47
dl 0
loc 97
ccs 54
cts 56
cp 0.9643
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A init() 0 72 2
A addDeclaration() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Spiral\Scaffolder\Bootloader;
6
7
use Cocur\Slugify\Slugify;
8
use Cocur\Slugify\SlugifyInterface;
9
use ReflectionClass;
10
use ReflectionException;
11
use Spiral\Boot\Bootloader\Bootloader;
12
use Spiral\Boot\KernelInterface;
13
use Spiral\Config\ConfiguratorInterface;
14
use Spiral\Config\Patch\Append;
15
use Spiral\Console\Bootloader\ConsoleBootloader;
16
use Spiral\Scaffolder\Command;
17
use Spiral\Scaffolder\Config\ScaffolderConfig;
18
use Spiral\Scaffolder\Declaration;
19
20
class ScaffolderBootloader extends Bootloader
21
{
22
    protected const BINDINGS = [
23
        SlugifyInterface::class => Slugify::class,
24
    ];
25
26 284
    public function __construct(
27
        private readonly ConfiguratorInterface $config,
28
        private readonly KernelInterface $kernel
29
    ) {
30 284
    }
31
32 284
    public function init(ConsoleBootloader $console): void
33
    {
34 284
        $console->addCommand(Command\BootloaderCommand::class);
35 284
        $console->addCommand(Command\CommandCommand::class);
36 284
        $console->addCommand(Command\ConfigCommand::class);
37 284
        $console->addCommand(Command\ControllerCommand::class);
38 284
        $console->addCommand(Command\JobHandlerCommand::class);
39 284
        $console->addCommand(Command\MiddlewareCommand::class);
40
41
        try {
42 284
            $defaultNamespace = (new ReflectionClass($this->kernel))->getNamespaceName();
43
        } catch (ReflectionException) {
44
            $defaultNamespace = '';
45
        }
46
47 284
        $this->config->setDefaults(ScaffolderConfig::CONFIG, [
48
            /*
49
             * This is set of comment lines to be applied to every scaffolded file, you can use env() function
50
             * to make it developer specific or set one universal pattern per project.
51
             */
52 284
            'header'       => [],
53
54
            /*
55
             * Base directory for generated classes, class will be automatically localed into sub directory
56
             * using given namespace.
57
             */
58 284
            'directory'    => directory('app') . 'src/',
59
60
            /*
61
             * Default namespace to be applied for every generated class. By default uses Kernel namespace
62
             *
63
             * Example: 'namespace' => 'MyApplication'
64
             * Controllers: MyApplication\Controllers\SampleController
65
             */
66 284
            'namespace'    => $defaultNamespace,
67
68
            /*
69
             * This is set of default settings to be used for your scaffolding commands.
70
             */
71 284
            'declarations' => [
72 284
                Declaration\BootloaderDeclaration::TYPE => [
73 284
                    'namespace' => 'Bootloader',
74 284
                    'postfix'   => 'Bootloader',
75 284
                    'class'     => Declaration\BootloaderDeclaration::class,
76 284
                ],
77 284
                Declaration\ConfigDeclaration::TYPE => [
78 284
                    'namespace' => 'Config',
79 284
                    'postfix'   => 'Config',
80 284
                    'class'     => Declaration\ConfigDeclaration::class,
81 284
                    'options'   => [
82 284
                        'directory' => directory('config'),
83 284
                    ],
84 284
                ],
85 284
                Declaration\ControllerDeclaration::TYPE => [
86 284
                    'namespace' => 'Controller',
87 284
                    'postfix'   => 'Controller',
88 284
                    'class'     => Declaration\ControllerDeclaration::class,
89 284
                ],
90 284
                Declaration\MiddlewareDeclaration::TYPE => [
91 284
                    'namespace' => 'Middleware',
92 284
                    'postfix'   => '',
93 284
                    'class'     => Declaration\MiddlewareDeclaration::class,
94 284
                ],
95 284
                Declaration\CommandDeclaration::TYPE => [
96 284
                    'namespace' => 'Command',
97 284
                    'postfix'   => 'Command',
98 284
                    'class'     => Declaration\CommandDeclaration::class,
99 284
                ],
100 284
                Declaration\JobHandlerDeclaration::TYPE => [
101 284
                    'namespace' => 'Job',
102 284
                    'postfix'   => 'Job',
103 284
                    'class'     => Declaration\JobHandlerDeclaration::class,
104 284
                ],
105 284
            ],
106 284
        ]);
107
    }
108
109
    /**
110
     * Register new Scaffolder declaration.
111
     */
112 3
    public function addDeclaration(string $name, array $declaration): void
113
    {
114 3
        $this->config->modify(
115 3
            ScaffolderConfig::CONFIG,
116 3
            new Append('declarations', $name, $declaration)
117 3
        );
118
    }
119
}
120