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

ScaffolderBootloader::addDeclaration()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
crap 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