Passed
Push — develop ( ac3052...955933 )
by nguereza
04:41
created

MakeEntityCommand::createClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 10
1
<?php
2
3
/**
4
 * Platine Framework
5
 *
6
 * Platine Framework is a lightweight, high-performance, simple and elegant
7
 * PHP Web framework
8
 *
9
 * This content is released under the MIT License (MIT)
10
 *
11
 * Copyright (c) 2020 Platine Framework
12
 *
13
 * Permission is hereby granted, free of charge, to any person obtaining a copy
14
 * of this software and associated documentation files (the "Software"), to deal
15
 * in the Software without restriction, including without limitation the rights
16
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
 * copies of the Software, and to permit persons to whom the Software is
18
 * furnished to do so, subject to the following conditions:
19
 *
20
 * The above copyright notice and this permission notice shall be included in all
21
 * copies or substantial portions of the Software.
22
 *
23
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
 * SOFTWARE.
30
 */
31
32
/**
33
 *  @file MakeEntityCommand.php
34
 *
35
 *  The Make Entity Command class
36
 *
37
 *  @package    Platine\Framework\Console\Command
38
 *  @author Platine Developers team
39
 *  @copyright  Copyright (c) 2020
40
 *  @license    http://opensource.org/licenses/MIT  MIT License
41
 *  @link   http://www.iacademy.cf
42
 *  @version 1.0.0
43
 *  @filesource
44
 */
45
46
declare(strict_types=1);
47
48
namespace Platine\Framework\Console\Command;
49
50
use Platine\Console\Input\Reader;
51
use Platine\Console\Output\Writer;
52
use Platine\Filesystem\Filesystem;
53
use Platine\Framework\App\Application;
54
use Platine\Framework\Console\MakeCommand;
55
56
/**
57
 * @class MakeEntityCommand
58
 * @package Platine\Framework\Console\Command
59
 */
60
class MakeEntityCommand extends MakeCommand
61
{
62
    /**
63
     * {@inheritdoc}
64
     */
65
    protected string $type = 'entity';
66
67
    /**
68
     * Whether
69
     * @var bool
70
     */
71
    protected bool $useTimestamp = false;
72
73
    /**
74
     * The name of field for created at
75
     * @var string
76
     */
77
    protected string $createdAtField = 'created_at';
78
79
    /**
80
     * The name of field for updated at
81
     * @var string
82
     */
83
    protected string $upatedAtField = 'updated_at';
84
85
    /**
86
     * Create new instance
87
     * @param Application $application
88
     * @param Filesystem $filesystem
89
     */
90
    public function __construct(
91
        Application $application,
92
        Filesystem $filesystem
93
    ) {
94
        parent::__construct($application, $filesystem);
95
        $this->setName('make:entity')
96
               ->setDescription('Command to generate new entity class');
97
    }
98
99
    /**
100
     * {@inheritdoc}
101
     */
102
    public function interact(Reader $reader, Writer $writer): void
103
    {
104
        parent::interact($reader, $writer);
105
106
107
        $io = $this->io();
108
109
        $this->useTimestamp = $io->confirm('Use timestamp feature', 'y');
110
111
        if ($this->useTimestamp) {
112
            $this->createdAtField = $io->prompt('Created at field name', 'created_at');
113
            $this->upatedAtField = $io->prompt('Updated at field name', 'updated_at');
114
        }
115
    }
116
117
    /**
118
     * {@inheritdoc}
119
     */
120
    public function getClassTemplate(): string
121
    {
122
        return <<<EOF
123
        <?php
124
        
125
        declare(strict_types=1);
126
        
127
        namespace %namespace%;
128
        
129
        use Platine\Orm\Entity;
130
        use Platine\Orm\Mapper\EntityMapperInterface;
131
        
132
        %uses%
133
134
        /**
135
        * @class %classname%
136
        * @package %namespace%
137
        */
138
        class %classname% extends Entity
139
        {
140
            
141
            /**
142
            * {@inheritdoc}
143
            */
144
            public static function mapEntity(EntityMapperInterface \$mapper): void
145
            {
146
             %mapper_body%
147
            }
148
        }
149
        
150
        EOF;
151
    }
152
153
    /**
154
     * {@inheritdoc}
155
     */
156
    protected function createClass(): string
157
    {
158
        $content = parent::createClass();
159
160
        return $this->getMapperBody($content);
161
    }
162
163
    /**
164
     * Return the mapper body
165
     * @param string $content
166
     * @return string
167
     */
168
    protected function getMapperBody(string $content): string
169
    {
170
        $result = '';
171
        if ($this->useTimestamp) {
172
            $useTimestamp = 'useTimestamp()';
173
            if ($this->createdAtField !== 'created_at' || $this->upatedAtField !== 'updated_at') {
174
                $useTimestamp = sprintf(
175
                    'useTimestamp(true, \'%s\', \'%s\')',
176
                    $this->createdAtField,
177
                    $this->upatedAtField
178
                );
179
            }
180
            $result = <<<EOF
181
            \$mapper->$useTimestamp;
182
                 \$mapper->casts([
183
                    '$this->createdAtField' => 'date',
184
                    '$this->upatedAtField' => '?date',
185
                 ]);
186
        EOF;
187
        }
188
189
        return str_replace('%mapper_body%', $result, $content);
190
    }
191
}
192