Issues (5)

src/Builder.php (1 issue)

1
<?php
2
3
namespace Rougin\Refinery;
4
5
use Rougin\Describe\Describe;
6
use Rougin\Describe\Column;
7
8
/**
9
 * Builder
10
 *
11
 * @package Refinery
12
 * @author  Rougin Gutib <[email protected]>
13
 */
14
class Builder
15
{
16
    /**
17
     * @var \Rougin\Describe\Column
18
     */
19
    protected $column;
20
21
    /**
22
     * @var \Rougin\Describe\Describe|null
23
     */
24
    protected $describe = null;
25
26
    /**
27
     * @var \Rougin\Refinery\Parser
28
     */
29
    protected $parser;
30
31
    /**
32
     * Initializes the column instance.
33
     */
34 39
    public function __construct()
35
    {
36 39
        $column = new Column;
37
38 39
        $column->setDataType('integer');
39
40 39
        $column->setLength(10);
41
42 39
        $column->setAutoIncrement(true);
43
44 39
        $this->column = $column;
45 39
    }
46
47
    /**
48
     * Sets the column instance to be used.
49
     *
50
     * @param  \Rougin\Describe\Column $column
51
     * @return self
52
     */
53 12
    public function column(Column $column)
54
    {
55 12
        $this->column = $column;
56
57 12
        return $this;
58
    }
59
60
    /**
61
     * Sets the Describe instance.
62
     *
63
     * @param  \Rougin\Describe\Describe $describe
64
     * @return self
65
     */
66 6
    public function describe(Describe $describe)
67
    {
68 6
        $this->describe = $describe;
69
70 6
        return $this;
71
    }
72
73
    /**
74
     * Builds the migration file.
75
     *
76
     * @param  string $name
77
     * @return boolean
78
     */
79 33
    public function make($name)
80
    {
81 33
        $this->parser = new Parser((string) $name);
82
83 33
        $migration = __DIR__ . '/Templates/Migration.txt';
84
85 33
        $file = file_get_contents($migration);
86
87 33
        $file = str_replace('$NAME', $name, $file);
88
89 33
        if ($this->describe instanceof Describe) {
90 6
            $file = str_replace('$UP', $this->database(), $file);
91
92 6
            $down = $this->template('DeleteTable');
93
94 6
            return str_replace('$DOWN', (string) $down, $file);
95
        }
96
97 27
        return $this->prepare($file, $this->column);
98
    }
99
100
    /**
101
     * Returns a string value of the specified data type.
102
     *
103
     * @param  boolean|string $value
104
     * @return string
105
     */
106 33
    protected function type($value)
107
    {
108 33
        if (is_string($value) === true) {
109 33
            $value === 'string' && $value = 'varchar';
110
111 33
            return mb_strtoupper((string) $value);
112
        }
113
114 33
        return $value ? 'TRUE' : 'FALSE';
115
    }
116
117
    /**
118
     * Generates code based from the column instance.
119
     *
120
     * @param  \Rougin\Describe\Column $column
121
     * @return string
122
     */
123 33
    protected function create(Column $column, $file)
124
    {
125 33
        $increment = $this->type($column->isAutoIncrement());
126
127 33
        $unsigned = $this->type($column->isUnsigned());
128
129 33
        $file = str_replace('$DEFAULT', $column->getDefaultValue(), $file);
130
131 33
        $file = str_replace('$INCREMENT', $increment, $file);
132
133 33
        $file = str_replace('$LENGTH', $column->getLength(), $file);
134
135 33
        $file = str_replace('$NULL', $this->type($column->isNull()), $file);
136
137 33
        $file = str_replace('$NAME', $column->getField(), $file);
138
139 33
        $file = str_replace('$TYPE', $this->type($column->getDataType()), $file);
140
141 33
        return str_replace('$UNSIGNED', $unsigned, (string) $file);
142
    }
143
144
    /**
145
     * Creates a migration based from a database schema.
146
     *
147
     * @return string
148
     */
149 6
    protected function database()
150
    {
151 6
        $table = (string) $this->parser->table();
152
153 6
        $up = '$this->dbforge->create_table(\'' . $table . '\');';
154
155 6
        $columns = $this->describe->columns($table);
0 ignored issues
show
The method columns() does not exist on null. ( Ignorable by Annotation )

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

155
        /** @scrutinizer ignore-call */ 
156
        $columns = $this->describe->columns($table);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
156
157 6
        foreach ($columns as $column) {
158 6
            $create = $this->template('CreateColumn');
159
160 6
            $data = $this->create($column, $create);
161
162 6
            $up = $data . "\r\n\r\n        " . $up;
163 2
        }
164
165 6
        return $up;
166
    }
167
168
    /**
169
     * Prepares the contents of the migration file.
170
     *
171
     * @param  string                  $file
172
     * @param  \Rougin\Describe\Column $column
173
     * @return string
174
     */
175 27
    protected function prepare($file, Column $column)
176
    {
177 27
        $text = $this->parser->column() ? 'Column' : 'Table';
178
179 27
        $up = $this->template('Create' . $text);
180
181 27
        $up = (string) $this->create($column, $up);
182
183 27
        $down = $this->template((string) 'Delete' . $text);
184
185 27
        $delete = array('delete', 'remove');
186
187 27
        $exists = in_array($this->parser->command(), $delete);
188
189 27
        $exists && list($up, $down) = array($down, $up);
190
191 27
        $file = (string) str_replace('$UP', $up, $file);
192
193 27
        return (string) str_replace('$DOWN', $down, $file);
194
    }
195
196
    /**
197
     * Creates a template based on given filename.
198
     *
199
     * @param  string $filename
200
     * @return string
201
     */
202 33
    protected function template($filename)
203
    {
204 33
        $file = __DIR__ . '/Templates/' . $filename . '.txt';
205
206 33
        $file = (string) file_get_contents((string) $file);
207
208 33
        $file = str_replace('$TABLE', $this->parser->table(), $file);
209
210 33
        $column = (string) $this->parser->column();
211
212 33
        $updated = str_replace('$NAME', $column, $file);
213
214 33
        return $column === '' ? $file : $updated;
215
    }
216
}
217