[ticket/14434] Extract migration check to a reusable method

PHPBB3-14434
This commit is contained in:
Matt Friedman 2016-01-27 10:50:22 -08:00
parent 7d2a58e271
commit 47d8aeebde
3 changed files with 47 additions and 23 deletions

View file

@ -79,14 +79,12 @@ class schema_generator
{ {
foreach ($migrations as $key => $migration_class) 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); unset($migrations[$key]);
if (!$reflector->implementsInterface('\phpbb\db\migration\migration_interface') || !$reflector->isInstantiable()) continue;
{
unset($migrations[$key]);
continue;
}
} }
$open_dependencies = array_diff($migration_class::depends_on(), $tree); $open_dependencies = array_diff($migration_class::depends_on(), $tree);

View file

@ -226,7 +226,7 @@ class migrator
*/ */
protected function try_apply($name) 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); $this->output_handler->write(array('MIGRATION_NOT_VALID', $name), migrator_output_handler_interface::VERBOSITY_DEBUG);
return false; return false;
@ -401,7 +401,7 @@ class migrator
*/ */
protected function try_revert($name) protected function try_revert($name)
{ {
if (!class_exists($name)) if (!class_exists($name) || !self::is_migration($name))
{ {
return false; return false;
} }
@ -719,7 +719,7 @@ class migrator
return false; return false;
} }
if (!class_exists($name)) if (!class_exists($name) || !self::is_migration($name))
{ {
return $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;
}
} }

View file

@ -139,19 +139,7 @@ class base implements \phpbb\extension\extension_interface
// Unset classes that do not exist or do not extend the // Unset classes that do not exist or do not extend the
// abstract class phpbb\db\migration\migration // abstract class phpbb\db\migration\migration
foreach ($migrations as $key => $migration) \phpbb\db\migrator::is_migration($migrations);
{
if (class_exists($migration))
{
$reflector = new \ReflectionClass($migration);
if ($reflector->implementsInterface('\phpbb\db\migration\migration_interface') && $reflector->isInstantiable())
{
continue;
}
}
unset($migrations[$key]);
}
return $migrations; return $migrations;
} }