This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace Consigliere\Components\Migrations; |
||
4 | |||
5 | use Illuminate\Support\Collection; |
||
6 | use Consigliere\Components\Component; |
||
7 | |||
8 | class Migrator |
||
9 | { |
||
10 | /** |
||
11 | * Pingpong Component instance. |
||
12 | * |
||
13 | * @var \Consigliere\Components\Component |
||
14 | */ |
||
15 | protected $component; |
||
16 | |||
17 | /** |
||
18 | * Laravel Application instance. |
||
19 | * |
||
20 | * @var \Illuminate\Foundation\Application. |
||
21 | */ |
||
22 | protected $laravel; |
||
23 | |||
24 | /** |
||
25 | * The database connection to be used |
||
26 | * |
||
27 | * @var string |
||
28 | */ |
||
29 | protected $database = ''; |
||
30 | |||
31 | /** |
||
32 | * Create new instance. |
||
33 | * |
||
34 | * @param \Consigliere\Components\Component $component |
||
35 | */ |
||
36 | public function __construct(Component $component) |
||
37 | { |
||
38 | $this->component = $component; |
||
39 | $this->laravel = $component->getLaravel(); |
||
0 ignored issues
–
show
|
|||
40 | } |
||
41 | |||
42 | /** |
||
43 | * Set the database connection to be used |
||
44 | * |
||
45 | * @param $database |
||
46 | * |
||
47 | * @return $this |
||
48 | */ |
||
49 | public function setDatabase($database) |
||
50 | { |
||
51 | if (is_string($database) && $database) { |
||
52 | $this->database = $database; |
||
53 | } |
||
54 | } |
||
55 | |||
56 | /** |
||
57 | * @return Component |
||
58 | */ |
||
59 | public function getComponent() |
||
60 | { |
||
61 | return $this->component; |
||
62 | } |
||
63 | |||
64 | /** |
||
65 | * Get migration path. |
||
66 | * |
||
67 | * @return string |
||
68 | */ |
||
69 | View Code Duplication | public function getPath() |
|
0 ignored issues
–
show
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. ![]() |
|||
70 | { |
||
71 | $config = $this->component->get('migration'); |
||
72 | |||
73 | $path = (is_array($config) && array_key_exists('path', $config)) ? $config['path'] : config('components.paths.generator.migration'); |
||
74 | |||
75 | return $this->component->getExtraPath($path); |
||
76 | } |
||
77 | |||
78 | /** |
||
79 | * Get migration files. |
||
80 | * |
||
81 | * @param boolean $reverse |
||
82 | * |
||
83 | * @return array |
||
84 | */ |
||
85 | View Code Duplication | public function getMigrations($reverse = false) |
|
0 ignored issues
–
show
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. ![]() |
|||
86 | { |
||
87 | $files = $this->laravel['files']->glob($this->getPath() . '/*_*.php'); |
||
88 | |||
89 | // Once we have the array of files in the directory we will just remove the |
||
90 | // extension and take the basename of the file which is all we need when |
||
91 | // finding the migrations that haven't been run against the databases. |
||
92 | if ($files === false) { |
||
93 | return []; |
||
94 | } |
||
95 | |||
96 | $files = array_map(function($file) { |
||
97 | return str_replace('.php', '', basename($file)); |
||
98 | |||
99 | }, $files); |
||
100 | |||
101 | // Once we have all of the formatted file names we will sort them and since |
||
102 | // they all start with a timestamp this should give us the migrations in |
||
103 | // the order they were actually created by the application developers. |
||
104 | sort($files); |
||
105 | |||
106 | if ($reverse) { |
||
107 | return array_reverse($files); |
||
108 | } |
||
109 | |||
110 | return $files; |
||
111 | } |
||
112 | |||
113 | /** |
||
114 | * Rollback migration. |
||
115 | * |
||
116 | * @return array |
||
117 | */ |
||
118 | View Code Duplication | public function rollback() |
|
0 ignored issues
–
show
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. ![]() |
|||
119 | { |
||
120 | $migrations = $this->getLast($this->getMigrations(true)); |
||
121 | |||
122 | $this->requireFiles($migrations->toArray()); |
||
123 | |||
124 | $migrated = []; |
||
125 | |||
126 | foreach ($migrations as $migration) { |
||
127 | $data = $this->find($migration); |
||
128 | |||
129 | if ($data->count()) { |
||
130 | $migrated[] = $migration; |
||
131 | |||
132 | $this->down($migration); |
||
133 | |||
134 | $data->delete(); |
||
135 | } |
||
136 | } |
||
137 | |||
138 | return $migrated; |
||
139 | } |
||
140 | |||
141 | /** |
||
142 | * Reset migration. |
||
143 | * |
||
144 | * @return array |
||
145 | */ |
||
146 | View Code Duplication | public function reset() |
|
0 ignored issues
–
show
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. ![]() |
|||
147 | { |
||
148 | $migrations = $this->getMigrations(true); |
||
149 | |||
150 | $this->requireFiles($migrations); |
||
151 | |||
152 | $migrated = []; |
||
153 | |||
154 | foreach ($migrations as $migration) { |
||
155 | $data = $this->find($migration); |
||
156 | |||
157 | if ($data->count()) { |
||
158 | $migrated[] = $migration; |
||
159 | |||
160 | $this->down($migration); |
||
161 | |||
162 | $data->delete(); |
||
163 | } |
||
164 | } |
||
165 | |||
166 | return $migrated; |
||
167 | } |
||
168 | |||
169 | /** |
||
170 | * Run down schema from the given migration name. |
||
171 | * |
||
172 | * @param string $migration |
||
173 | */ |
||
174 | public function down($migration) |
||
175 | { |
||
176 | $this->resolve($migration)->down(); |
||
177 | } |
||
178 | |||
179 | /** |
||
180 | * Run up schema from the given migration name. |
||
181 | * |
||
182 | * @param string $migration |
||
183 | */ |
||
184 | public function up($migration) |
||
185 | { |
||
186 | $this->resolve($migration)->up(); |
||
187 | } |
||
188 | |||
189 | /** |
||
190 | * Resolve a migration instance from a file. |
||
191 | * |
||
192 | * @param string $file |
||
193 | * |
||
194 | * @return object |
||
195 | */ |
||
196 | public function resolve($file) |
||
197 | { |
||
198 | $file = implode('_', array_slice(explode('_', $file), 4)); |
||
199 | |||
200 | $class = studly_case($file); |
||
201 | |||
202 | return new $class(); |
||
203 | } |
||
204 | |||
205 | /** |
||
206 | * Require in all the migration files in a given path. |
||
207 | * |
||
208 | * @param array $files |
||
209 | */ |
||
210 | public function requireFiles(array $files) |
||
211 | { |
||
212 | $path = $this->getPath(); |
||
213 | foreach ($files as $file) { |
||
214 | $this->laravel['files']->requireOnce($path . '/' . $file . '.php'); |
||
215 | } |
||
216 | } |
||
217 | |||
218 | /** |
||
219 | * Get table instance. |
||
220 | * |
||
221 | * @return string |
||
222 | */ |
||
223 | public function table() |
||
224 | { |
||
225 | return $this->database ? $this->laravel['db']->connection($this->database)->table(config('database.migrations')) : $this->laravel['db']->table(config('database.migrations')); |
||
226 | } |
||
227 | |||
228 | /** |
||
229 | * Find migration data from database by given migration name. |
||
230 | * |
||
231 | * @param string $migration |
||
232 | * |
||
233 | * @return object |
||
234 | */ |
||
235 | public function find($migration) |
||
236 | { |
||
237 | return $this->table()->whereMigration($migration); |
||
0 ignored issues
–
show
|
|||
238 | } |
||
239 | |||
240 | /** |
||
241 | * Save new migration to database. |
||
242 | * |
||
243 | * @param string $migration |
||
244 | * |
||
245 | * @return mixed |
||
246 | */ |
||
247 | public function log($migration) |
||
248 | { |
||
249 | return $this->table()->insert([ |
||
0 ignored issues
–
show
|
|||
250 | 'migration' => $migration, |
||
251 | 'batch' => $this->getNextBatchNumber(), |
||
252 | ]); |
||
253 | } |
||
254 | |||
255 | /** |
||
256 | * Get the next migration batch number. |
||
257 | * |
||
258 | * @return int |
||
259 | */ |
||
260 | public function getNextBatchNumber() |
||
261 | { |
||
262 | return $this->getLastBatchNumber() + 1; |
||
0 ignored issues
–
show
|
|||
263 | } |
||
264 | |||
265 | /** |
||
266 | * Get the last migration batch number. |
||
267 | * |
||
268 | * @param array $migrations |
||
269 | * |
||
270 | * @return int |
||
271 | */ |
||
272 | public function getLastBatchNumber($migrations) |
||
273 | { |
||
274 | return $this->table() |
||
0 ignored issues
–
show
|
|||
275 | ->whereIn('migration', $migrations) |
||
276 | ->max('batch'); |
||
277 | } |
||
278 | |||
279 | /** |
||
280 | * Get the last migration batch. |
||
281 | * |
||
282 | * @param array $migrations |
||
283 | * |
||
284 | * @return Collection |
||
285 | */ |
||
286 | public function getLast($migrations) |
||
287 | { |
||
288 | $query = $this->table() |
||
0 ignored issues
–
show
|
|||
289 | ->where('batch', $this->getLastBatchNumber($migrations)) |
||
290 | ->whereIn('migration', $migrations); |
||
291 | |||
292 | $result = $query->orderBy('migration', 'desc')->get(); |
||
293 | |||
294 | return collect($result)->map(function($item) { |
||
295 | return (array)$item; |
||
296 | })->pluck('migration'); |
||
297 | } |
||
298 | |||
299 | /** |
||
300 | * Get the ran migrations. |
||
301 | * |
||
302 | * @return Collection |
||
303 | */ |
||
304 | public function getRan() |
||
305 | { |
||
306 | return $this->table()->pluck('migration'); |
||
0 ignored issues
–
show
|
|||
307 | } |
||
308 | } |
||
309 |
Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.
Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..