Completed
Pull Request — master (#20)
by Pavel
10:22
created

GenerateMigrationCommand::execute()   B

Complexity

Conditions 2
Paths 1

Size

Total Lines 31
Code Lines 19

Duplication

Lines 31
Ratio 100 %

Importance

Changes 0
Metric Value
dl 31
loc 31
rs 8.8571
c 0
b 0
f 0
cc 2
eloc 19
nc 1
nop 2
1
<?php
2
3
namespace App\Console\Commands;
4
5
use App\Common\Helper;
6
use Symfony\Component\Console\Command\Command;
7
use Symfony\Component\Console\Input\InputInterface;
8
use Symfony\Component\Console\Output\OutputInterface;
9
use Symfony\Component\Console\Question\Question;
10
11
/**
12
 * GenerateMigrationCommand
13
 */
14
class GenerateMigrationCommand extends Command
15
{
16
    /**
17
     * Configuration of command
18
     */
19
    protected function configure()
20
    {
21
        $this
22
            ->setName('generate:migration')
23
            ->setDescription('Generate new migration')
24
            ->setHelp('php partisan generate:migration</info>')
25
        ;
26
    }
27
28
    /**
29
     * Execute method of command
30
     *
31
     * @param InputInterface $input
32
     * @param OutputInterface $output
33
     * @return int|null|void
34
     * @throws \Exception
35
     */
36 View Code Duplication
    protected function execute(InputInterface $input, OutputInterface $output)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
37
    {
38
        $output->writeln(['<comment>Welcome to the migration generator</comment>']);
39
40
        $helper   = $this->getHelper('question');
41
        $question = new Question('<info>Please enter the name of the migration: </info>');
42
        $question->setValidator(function ($answer) {
43
            if (strlen(trim($answer)) === 0) {
44
                throw new \RunTimeException('The name of the migration should be not empty');
45
            }
46
47
            return $answer;
48
        });
49
50
        $migrationName = $helper->ask($input, $output, $question);
51
        $path          = $this->getPathForMigration($migrationName);
52
        $placeHolders  = [
53
            '<class>',
54
            '<tableName>',
55
        ];
56
        $replacements  = [
57
            Helper::underscoreToCamelCase($migrationName, true),
58
            strtolower($migrationName),
59
        ];
60
61
        $this->generateCode($placeHolders, $replacements, 'MigrationTemplate.tpl', $path);
62
63
        $output->writeln(sprintf('Generated new migration class to "<info>%s</info>"', realpath($path)));
64
65
        return;
66
    }
67
68
    /**
69
     * Generate code
70
     *
71
     * @param array  $placeHolders
72
     * @param array  $replacements
73
     * @param string $templateName
74
     * @param string $resultPath
75
     * @return bool|int
76
     */
77 View Code Duplication
    public function generateCode($placeHolders, $replacements, $templateName, $resultPath)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
78
    {
79
        $templatePath = CODE_TEMPLATE_PATH . '/' . $templateName;
80
        if (false === file_exists($templatePath)) {
81
            throw new \RunTimeException(sprintf('Not found template %s', $templatePath));
82
        }
83
84
        $template = file_get_contents($templatePath);
85
86
        $code = str_replace($placeHolders, $replacements, $template);
87
88
        return file_put_contents($resultPath, $code);
89
    }
90
91
    /**
92
     * @param string $migrationName
93
     * @return string
94
     * @throws \Exception
95
     */
96 View Code Duplication
    private function getPathForMigration($migrationName)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
97
    {
98
        $dir = rtrim(MIGRATIONS_PATH, '/');
99
        if (!file_exists($dir)) {
100
            throw new \Exception(sprintf('Migration directory "%s" does not exist.', $dir));
101
        }
102
103
        $baseName = date('YmdHis') . '_' . $migrationName . '.php';
104
105
        return $dir . '/' . $baseName;
106
    }
107
}
108