Completed
Push — master ( a1ba7f...e84c3e )
by Dmitrij
02:27
created

CreateModelCommand   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 4
dl 0
loc 91
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A execute() 0 14 2
B configure() 0 25 1
B processModelFile() 0 34 1
1
<?php
2
3
namespace HotRodCli\Commands\Classes;
4
5
use HotRodCli\Commands\BaseCommand;
6
use HotRodCli\Jobs\Filesystem\CopyFile;
7
use HotRodCli\Jobs\Module\IsModuleExists;
8
use HotRodCli\Jobs\Module\ReplaceText;
9
use HotRodCli\Processors\ProcessCollectionFile;
10
use HotRodCli\Processors\ProcessResourceModelFile;
11
use Symfony\Component\Console\Input\InputInterface;
12
use Symfony\Component\Console\Output\OutputInterface;
13
use Symfony\Component\Console\Input\InputArgument;
14
15
class CreateModelCommand extends BaseCommand
16
{
17
    protected $jobs = [
18
        IsModuleExists::class => null,
19
        CopyFile::class => null,
20
        ReplaceText::class => null
21
    ];
22
23
    protected $processors = [
24
        ProcessResourceModelFile::class => null,
25
        ProcessCollectionFile::class => null
26
    ];
27
28
    protected function configure()
29
    {
30
        $this->setName('create:model')
31
            ->setDescription('Creates a new model')
32
            ->addArgument(
33
                'namespace',
34
                InputArgument::REQUIRED,
35
                'What is the namespace on the module'
36
            )
37
            ->addArgument(
38
                'name',
39
                InputArgument::REQUIRED,
40
                'What is the name of the new Model'
41
            )
42
            ->addArgument(
43
                'table-name',
44
                InputArgument::REQUIRED,
45
                'What is the table name for the new Model'
46
            )
47
            ->addArgument(
48
                'id-field',
49
                InputArgument::REQUIRED,
50
                'What is the id-field of the table'
51
            )
52
            ->setHelp('creates a new Resource Model in a given namespace');
53
    }
54
55
    protected function execute(InputInterface $input, OutputInterface $output)
56
    {
57
        $this->setJobs();
58
        $this->setProcessors();
59
        $jobs = $this->jobs;
60
61
        try {
62
            $jobs[IsModuleExists::class]->handle($input->getArgument('namespace'), $output);
63
64
            $this->processModelFile($input, $output);
65
66
            $this->runProcessors($input, $output);
67
        } catch (\Throwable $e) {
68
            $output->writeln('<error>' . $e->getMessage() . '</error>');
69
        }
70
    }
71
72
    protected function processModelFile(InputInterface $input, OutputInterface $output)
73
    {
74
        $namespace = explode('_', $input->getArgument('namespace'));
75
76
        $this->jobs[CopyFile::class]->handle(
77
            $this->appContainer->get('resource_dir') . '/classes/Model.tphp',
78
            $this->appContainer->get('app_dir') . '/app/code/' . $namespace[0] . '/' . $namespace[1] . '/Model/' . $input->getArgument('name') . '.php'
79
        );
80
81
        $this->jobs[ReplaceText::class]->handle(
82
            '{{namespace}}',
83
            str_replace('_', '\\', $input->getArgument('namespace')),
84
            $this->appContainer->get('app_dir') . '/app/code/' . $namespace[0] . '/' . $namespace[1] . '/Model/'
85
        );
86
87
        $this->jobs[ReplaceText::class]->handle(
88
            '{{ModelName}}',
89
            $input->getArgument('name'),
90
            $this->appContainer->get('app_dir') . '/app/code/' . $namespace[0] . '/' . $namespace[1] . '/Model/'
91
        );
92
93
        $this->jobs[ReplaceText::class]->handle(
94
            '{{tag}}',
95
            $input->getArgument('table-name'),
96
            $this->appContainer->get('app_dir') . '/app/code/' . $namespace[0] . '/' . $namespace[1] . '/Model/'
97
        );
98
99
        $this->jobs[ReplaceText::class]->handle(
100
            '{{ResourceModel}}',
101
            str_replace('_', '\\', $input->getArgument('namespace')) . '\\Model\\ResourceModel\\' . $input->getArgument('name'),
102
            $this->appContainer->get('app_dir') . '/app/code/' . $namespace[0] . '/' . $namespace[1] . '/Model/'
103
        );
104
105
        $output->writeln('<info>Model ' . $input->getArgument('name') . ' was successfully created</info>');
106
    }
107
}
108