Passed
Push — master ( 1d5b12...ea0462 )
by Anton
02:31
created

CommandBootloader::configureExtensions()   C

Complexity

Conditions 9
Paths 256

Size

Total Lines 32
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 16
c 1
b 0
f 0
dl 0
loc 32
rs 6.5222
cc 9
nc 256
nop 2
1
<?php
2
3
/**
4
 * Spiral Framework.
5
 *
6
 * @license   MIT
7
 * @author    Anton Titov (Wolfy-J)
8
 */
9
10
declare(strict_types=1);
11
12
namespace Spiral\Bootloader;
13
14
use Cycle\ORM\ORMInterface;
15
use Psr\Container\ContainerInterface;
16
use Spiral\Boot\Bootloader\Bootloader;
17
use Spiral\Command\Cycle;
18
use Spiral\Command\Database;
19
use Spiral\Command\Encrypter;
20
use Spiral\Command\GRPC;
21
use Spiral\Command\Migrate;
22
use Spiral\Command\Router;
23
use Spiral\Command\Translator;
24
use Spiral\Command\Views;
25
use Spiral\Console;
26
use Spiral\Console\Sequence\RuntimeDirectory;
27
use Spiral\Core\Container;
28
use Spiral\Database\DatabaseProviderInterface;
29
use Spiral\Encrypter\EncryptionInterface;
30
use Spiral\Files\FilesInterface;
31
use Spiral\GRPC\InvokerInterface;
32
use Spiral\Migrations\Migrator;
33
use Spiral\Router\RouterInterface;
34
use Spiral\Translator\Config\TranslatorConfig;
35
use Spiral\Translator\TranslatorInterface;
36
use Spiral\Views\ViewsInterface;
37
use Symfony\Component\Console\Output\OutputInterface;
38
39
/**
40
 * Register framework directories in tokenizer in order to locate default commands.
41
 */
42
final class CommandBootloader extends Bootloader
43
{
44
    protected const DEPENDENCIES = [
45
        ConsoleBootloader::class,
46
    ];
47
48
    /**
49
     * @param ConsoleBootloader $console
50
     * @param Container         $container
51
     */
52
    public function boot(ConsoleBootloader $console, Container $container): void
53
    {
54
        $console->addCommand(Console\Command\ConfigureCommand::class);
55
        $console->addCommand(Console\Command\UpdateCommand::class);
56
57
        $console->addConfigureSequence(
58
            [RuntimeDirectory::class, 'ensure'],
59
            '<fg=magenta>[runtime]</fg=magenta> <fg=cyan>verify `runtime` directory access</fg=cyan>'
60
        );
61
62
        $this->configureExtensions($console, $container);
63
    }
64
65
    /**
66
     * @return array
67
     */
68
    public function defineDependencies(): array
69
    {
70
        return [
71
            ConsoleBootloader::class
72
        ];
73
    }
74
75
    /**
76
     * @param ConsoleBootloader $console
77
     * @param Container         $container
78
     */
79
    private function configureExtensions(ConsoleBootloader $console, Container $container): void
80
    {
81
        if ($container->has(DatabaseProviderInterface::class)) {
82
            $this->configureDatabase($console);
83
        }
84
85
        if ($container->has(ORMInterface::class)) {
86
            $this->configureCycle($console, $container);
87
        }
88
89
        if ($container->has(TranslatorInterface::class)) {
90
            $this->configureTranslator($console);
91
        }
92
93
        if ($container->has(ViewsInterface::class)) {
94
            $this->configureViews($console);
95
        }
96
97
        if ($container->has(Migrator::class)) {
98
            $this->configureMigrations($console);
99
        }
100
101
        if ($container->has(InvokerInterface::class)) {
102
            $this->configureGRPC($console);
103
        }
104
105
        if ($container->has(EncryptionInterface::class)) {
106
            $this->configureEncrypter($console);
107
        }
108
109
        if ($container->has(RouterInterface::class)) {
110
            $console->addCommand(Router\ListCommand::class);
111
        }
112
    }
113
114
    /**
115
     * @param ConsoleBootloader $console
116
     */
117
    private function configureDatabase(ConsoleBootloader $console): void
118
    {
119
        $console->addCommand(Database\ListCommand::class);
120
        $console->addCommand(Database\TableCommand::class);
121
    }
122
123
    /**
124
     * @param ConsoleBootloader  $console
125
     * @param ContainerInterface $container
126
     */
127
    private function configureCycle(ConsoleBootloader $console, ContainerInterface $container): void
128
    {
129
        $console->addCommand(Cycle\UpdateCommand::class);
130
131
        $console->addUpdateSequence(
132
            'cycle',
133
            '<fg=magenta>[cycle]</fg=magenta> <fg=cyan>update Cycle schema...</fg=cyan>'
134
        );
135
136
        $console->addCommand(Cycle\SyncCommand::class);
137
138
        if ($container->has(Migrator::class)) {
139
            $console->addCommand(Cycle\MigrateCommand::class);
140
        }
141
    }
142
143
    /**
144
     * @param ConsoleBootloader $console
145
     **/
146
    private function configureTranslator(ConsoleBootloader $console): void
147
    {
148
        $console->addCommand(Translator\IndexCommand::class);
149
        $console->addCommand(Translator\ExportCommand::class);
150
        $console->addCommand(Translator\ResetCommand::class);
151
152
        $console->addConfigureSequence(
153
            function (FilesInterface $files, TranslatorConfig $config, OutputInterface $output): void {
0 ignored issues
show
Bug introduced by
function(...) { /* ... */ } of type callable is incompatible with the type array|string expected by parameter $sequence of Spiral\Bootloader\Consol...:addConfigureSequence(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

153
            /** @scrutinizer ignore-type */ function (FilesInterface $files, TranslatorConfig $config, OutputInterface $output): void {
Loading history...
154
                $files->ensureDirectory($config->getLocaleDirectory($config->getDefaultLocale()));
155
                $output->writeln('<info>The default locale directory has been ensured.</info>');
156
            },
157
            '<fg=magenta>[i18n]</fg=magenta> <fg=cyan>ensure default locale directory...</fg=cyan>'
158
        );
159
160
        $console->addConfigureSequence(
161
            'i18n:index',
162
            '<fg=magenta>[i18n]</fg=magenta> <fg=cyan>scan translator function and [[values]] usage...</fg=cyan>'
163
        );
164
    }
165
166
    /**
167
     * @param ConsoleBootloader $console
168
     */
169
    private function configureViews(ConsoleBootloader $console): void
170
    {
171
        $console->addCommand(Views\ResetCommand::class);
172
        $console->addCommand(Views\CompileCommand::class);
173
174
        $console->addConfigureSequence(
175
            'views:compile',
176
            '<fg=magenta>[views]</fg=magenta> <fg=cyan>warm up view cache...</fg=cyan>'
177
        );
178
    }
179
180
    /**
181
     * @param ConsoleBootloader $console
182
     */
183
    private function configureMigrations(ConsoleBootloader $console): void
184
    {
185
        $console->addCommand(Migrate\InitCommand::class);
186
        $console->addCommand(Migrate\StatusCommand::class);
187
        $console->addCommand(Migrate\MigrateCommand::class);
188
        $console->addCommand(Migrate\RollbackCommand::class);
189
        $console->addCommand(Migrate\ReplayCommand::class);
190
    }
191
192
    /**
193
     * @param ConsoleBootloader $console
194
     */
195
    private function configureGRPC(ConsoleBootloader $console): void
196
    {
197
        $console->addCommand(GRPC\GenerateCommand::class);
198
        $console->addCommand(GRPC\ListCommand::class);
199
    }
200
201
    /**
202
     * @param ConsoleBootloader $console
203
     */
204
    private function configureEncrypter(ConsoleBootloader $console): void
205
    {
206
        $console->addCommand(Encrypter\KeyCommand::class);
207
    }
208
}
209