diff options
author | Matt Friedman <maf675@gmail.com> | 2016-01-27 10:50:22 -0800 |
---|---|---|
committer | Matt Friedman <maf675@gmail.com> | 2016-01-27 10:50:22 -0800 |
commit | 47d8aeebde6f763ec7247daf0df16dd2388b25b6 (patch) | |
tree | 3fa4bcd6bd3c0a3337639755485f1967af122d83 | |
parent | 7d2a58e27100e5c776b44223e2cc6837c293db02 (diff) | |
download | forums-47d8aeebde6f763ec7247daf0df16dd2388b25b6.tar forums-47d8aeebde6f763ec7247daf0df16dd2388b25b6.tar.gz forums-47d8aeebde6f763ec7247daf0df16dd2388b25b6.tar.bz2 forums-47d8aeebde6f763ec7247daf0df16dd2388b25b6.tar.xz forums-47d8aeebde6f763ec7247daf0df16dd2388b25b6.zip |
[ticket/14434] Extract migration check to a reusable method
PHPBB3-14434
-rw-r--r-- | phpBB/phpbb/db/migration/schema_generator.php | 12 | ||||
-rw-r--r-- | phpBB/phpbb/db/migrator.php | 44 | ||||
-rw-r--r-- | phpBB/phpbb/extension/base.php | 14 |
3 files changed, 47 insertions, 23 deletions
diff --git a/phpBB/phpbb/db/migration/schema_generator.php b/phpBB/phpbb/db/migration/schema_generator.php index 55ab4452ed..dc685bb161 100644 --- a/phpBB/phpbb/db/migration/schema_generator.php +++ b/phpBB/phpbb/db/migration/schema_generator.php @@ -79,14 +79,12 @@ class schema_generator { foreach ($migrations as $key => $migration_class) { - if (class_exists($migration_class)) + // Unset classes that do not exist or do not extend the + // abstract class phpbb\db\migration\migration + if (\phpbb\db\migrator::is_migration($migration_class) === false) { - $reflector = new \ReflectionClass($migration_class); - if (!$reflector->implementsInterface('\phpbb\db\migration\migration_interface') || !$reflector->isInstantiable()) - { - unset($migrations[$key]); - continue; - } + unset($migrations[$key]); + continue; } $open_dependencies = array_diff($migration_class::depends_on(), $tree); diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php index d91860949a..563958b258 100644 --- a/phpBB/phpbb/db/migrator.php +++ b/phpBB/phpbb/db/migrator.php @@ -226,7 +226,7 @@ class migrator */ protected function try_apply($name) { - if (!class_exists($name)) + if (!class_exists($name) || !self::is_migration($name)) { $this->output_handler->write(array('MIGRATION_NOT_VALID', $name), migrator_output_handler_interface::VERBOSITY_DEBUG); return false; @@ -401,7 +401,7 @@ class migrator */ protected function try_revert($name) { - if (!class_exists($name)) + if (!class_exists($name) || !self::is_migration($name)) { return false; } @@ -719,7 +719,7 @@ class migrator return false; } - if (!class_exists($name)) + if (!class_exists($name) || !self::is_migration($name)) { return $name; } @@ -857,4 +857,42 @@ class migrator )); } } + + /** + * Check if a class is a migration. + * + * @param mixed $migration An array of migration name strings, or + * a single migration name string. + * @return bool Returns true or false for a single migration. + * If an array was received, non-migrations will + * be removed from the array, and false is returned. + */ + static public function is_migration(&$migration) + { + if (is_array($migration)) + { + foreach ($migration as $key => $name) + { + if (self::is_migration($name)) + { + continue; + } + + unset($migration[$key]); + } + } + else if (class_exists($migration)) + { + // Migration classes should extend the abstract class + // phpbb\db\migration\migration which implements the + // migration_interface and be instantiable. + $reflector = new \ReflectionClass($migration); + if ($reflector->implementsInterface('\phpbb\db\migration\migration_interface') && $reflector->isInstantiable()) + { + return true; + } + } + + return false; + } } diff --git a/phpBB/phpbb/extension/base.php b/phpBB/phpbb/extension/base.php index b647242b98..b05c1af8d4 100644 --- a/phpBB/phpbb/extension/base.php +++ b/phpBB/phpbb/extension/base.php @@ -139,19 +139,7 @@ class base implements \phpbb\extension\extension_interface // Unset classes that do not exist or do not extend the // abstract class phpbb\db\migration\migration - foreach ($migrations as $key => $migration) - { - if (class_exists($migration)) - { - $reflector = new \ReflectionClass($migration); - if ($reflector->implementsInterface('\phpbb\db\migration\migration_interface') && $reflector->isInstantiable()) - { - continue; - } - } - - unset($migrations[$key]); - } + \phpbb\db\migrator::is_migration($migrations); return $migrations; } |