version_from = $from; $this->version_to = $to; $this->migrations_dir = $migrations_dir; } /** * Run the various upgrade routines, all the way up to the latest version */ public function run() { $migrations = $this->find_migrations(); // run in sub-function for scope array_map([ $this, 'run_migration' ], $migrations); } /** * @return array */ public function find_migrations() { $files = glob(rtrim($this->migrations_dir, '/') . '/*.php'); $migrations = []; // return empty array when glob returns non-array value. if (! is_array($files)) { return $migrations; } foreach ($files as $file) { $migration = basename($file); $parts = explode('-', $migration); $version = $parts[0]; // check if migration file is not for an even higher version if (version_compare($version, $this->version_to, '>')) { continue; } // check if we ran migration file before. if (version_compare($this->version_from, $version, '>=')) { continue; } // schedule migration file for running $migrations[] = $file; } return $migrations; } /** * Include a migration file and runs it. * * @param string $file * * @throws Exception */ protected function run_migration($file) { if (! file_exists($file)) { throw new Exception(sprintf('Migration file %s does not exist.', esc_html(basename((string) $file)))); } include $file; } }