diff --git a/framework/core/src/Api/Controller/UpdateExtensionController.php b/framework/core/src/Api/Controller/UpdateExtensionController.php index a8ad2ba3a..716dc8108 100644 --- a/framework/core/src/Api/Controller/UpdateExtensionController.php +++ b/framework/core/src/Api/Controller/UpdateExtensionController.php @@ -42,12 +42,10 @@ class UpdateExtensionController implements ControllerInterface $enabled = array_get($request->getParsedBody(), 'enabled'); $name = array_get($request->getQueryParams(), 'name'); - $extension = $this->extensions->getExtension($name); - if ($enabled === true) { - $this->extensions->enable($extension); + $this->extensions->enable($name); } elseif ($enabled === false) { - $this->extensions->disable($extension); + $this->extensions->disable($name); } } } diff --git a/framework/core/src/Database/Migrator.php b/framework/core/src/Database/Migrator.php index 3b6b646db..7155b7555 100755 --- a/framework/core/src/Database/Migrator.php +++ b/framework/core/src/Database/Migrator.php @@ -12,10 +12,8 @@ namespace Flarum\Database; use Flarum\Extension\Extension; -use Illuminate\Container\Container; use Illuminate\Database\ConnectionResolverInterface as Resolver; use Illuminate\Filesystem\Filesystem; -use Illuminate\Support\Str; class Migrator { @@ -88,18 +86,17 @@ class Migrator $migrations = array_diff($files, $ran); - $this->runMigrationList($migrations, $path, $extension); + $this->runMigrationList($path, $migrations, $extension); } /** * Run an array of migrations. * - * @param array $migrations - * @param string $path - * @param Extension $extension - * @return void + * @param string $path + * @param array $migrations + * @param Extension $extension */ - public function runMigrationList($migrations, $path, Extension $extension = null) + public function runMigrationList($path, $migrations, Extension $extension = null) { // First we will just make sure that there are any migrations to run. If there // aren't, we will just make a note of it to the developer so they're aware @@ -114,28 +111,24 @@ class Migrator // migrations "up" so the changes are made to the databases. We'll then log // that the migration was run so we don't repeat it next time we execute. foreach ($migrations as $file) { - $this->runUp($file, $path, $extension); + $this->runUp($path, $file, $extension); } } /** * Run "up" a migration instance. * + * @param string $path * @param string $file * @param string $path * @param Extension $extension * @return void */ - protected function runUp($file, $path, Extension $extension = null) + protected function runUp($path, $file, Extension $extension = null) { - // First we will resolve a "real" instance of the migration class from this - // migration file name. Once we have the instances we can run the actual - // command such as "up" or "down", or we can just simulate the action. - $migration = $this->resolve($file, $path); + $migration = $this->resolve($path, $file); - if (isset($migration['up'])) { - app()->call($migration['up']); - } + $this->runClosureMigration($migration); // Once we have run a migrations class, we will log that it was run in this // repository so that we don't try to run it next time we do a migration @@ -164,7 +157,7 @@ class Migrator $this->note('Nothing to rollback.'); } else { foreach ($migrations as $migration) { - $this->runDown($migration, $path, $extension); + $this->runDown($path, $migration, $extension); } } @@ -174,21 +167,16 @@ class Migrator /** * Run "down" a migration instance. * + * @param $path * @param string $file * @param string $path * @param Extension $extension - * @return void */ - protected function runDown($file, $path, Extension $extension = null) + protected function runDown($path, $file, Extension $extension = null) { - // First we will get the file name of the migration so we can resolve out an - // instance of the migration. Once we get an instance we can either run a - // pretend execution of the migration or we can run the real migration. - $migration = $this->resolve($file, $path); + $migration = $this->resolve($path, $file); - if (isset($migration['down'])) { - app()->call($migration['down']); - } + $this->runClosureMigration($migration, 'down'); // Once we have successfully run the migration "down" we will remove it from // the migration repository so it will be considered to have not been run @@ -198,6 +186,22 @@ class Migrator $this->note("Rolled back: $file"); } + /** + * Runs a closure migration based on the migrate direction. + * + * @param $migration + * @param string $direction + * @throws \Exception + */ + protected function runClosureMigration($migration, $direction = 'up') + { + if (is_array($migration) && array_key_exists($direction, $migration)) { + app()->call($migration[$direction]); + } else { + throw new \Exception("Migration file should contain an array with up/down."); + } + } + /** * Get all of the migration files in a given path. * @@ -208,9 +212,6 @@ class Migrator { $files = $this->files->glob($path . '/*_*.php'); - // Once we have the array of files in the directory we will just remove the - // extension and take the basename of the file which is all we need when - // finding the migrations that haven't been run against the databases. if ($files === false) { return []; } @@ -228,15 +229,19 @@ class Migrator } /** - * Load a migration instance from a file. + * Resolve a migration instance from a file. * - * @param string $file * @param string $path - * @return object + * @param string $file + * @return array */ - public function resolve($file, $path) + public function resolve($path, $file) { - return $this->files->getRequire("$path/$file.php"); + $migration = "$path/$file.php"; + + if ($this->files->exists($migration)) { + return $this->files->getRequire($migration); + } } /** diff --git a/framework/core/src/Extension/Extension.php b/framework/core/src/Extension/Extension.php index 22f9f2380..0aac948a2 100644 --- a/framework/core/src/Extension/Extension.php +++ b/framework/core/src/Extension/Extension.php @@ -39,7 +39,7 @@ class Extension implements Arrayable /** * Unique Id of the extension. * - * @info Identical to the directory in the extensions directory. + * @info Identical to the directory in the extensions directory. * @example flarum_suspend * * @var string @@ -222,6 +222,14 @@ class Extension implements Arrayable return $this->id; } + /** + * @return string + */ + public function getPath() + { + return $this->path; + } + /** * Tests whether the extension has assets. * @@ -250,11 +258,11 @@ class Extension implements Arrayable public function toArray() { return (array) array_merge([ - 'id' => $this->getId(), - 'version' => $this->getVersion(), - 'path' => $this->path, - 'icon' => $this->getIcon(), - 'hasAssets' => $this->hasAssets(), + 'id' => $this->getId(), + 'version' => $this->getVersion(), + 'path' => $this->path, + 'icon' => $this->getIcon(), + 'hasAssets' => $this->hasAssets(), 'hasMigrations' => $this->hasMigrations(), ], $this->composerJson); } diff --git a/framework/core/src/Extension/ExtensionManager.php b/framework/core/src/Extension/ExtensionManager.php index cdcc975de..33f20ff74 100644 --- a/framework/core/src/Extension/ExtensionManager.php +++ b/framework/core/src/Extension/ExtensionManager.php @@ -182,7 +182,7 @@ class ExtensionManager { if ($extension->hasAssets()) { $this->filesystem->copyDirectory( - $this->app->basePath() . '/extensions/' . $extension->getId() . '/assets', + $extension->getPath() . '/assets', $this->app->basePath() . '/assets/extensions/' . $extension->getId() ); } @@ -219,7 +219,7 @@ class ExtensionManager public function migrate(Extension $extension, $up = true) { if ($extension->hasMigrations()) { - $migrationDir = public_path('extensions/' . $extension->getId() . '/migrations'); + $migrationDir = $extension->getPath() . '/migrations'; $this->app->bind('Illuminate\Database\Schema\Builder', function ($container) { return $container->make('Illuminate\Database\ConnectionInterface')->getSchemaBuilder(); @@ -240,7 +240,7 @@ class ExtensionManager */ public function migrateDown(Extension $extension) { - $this->migrate($extension->getId(), false); + $this->migrate($extension, false); } public function getMigrator() diff --git a/framework/core/src/Update/Console/MigrateCommand.php b/framework/core/src/Update/Console/MigrateCommand.php index 6356d2c6b..72d5e813e 100644 --- a/framework/core/src/Update/Console/MigrateCommand.php +++ b/framework/core/src/Update/Console/MigrateCommand.php @@ -81,7 +81,7 @@ class MigrateCommand extends AbstractCommand $this->info('Migrating extension: '.$name); - $extensions->migrate($name); + $extensions->migrate($extension); foreach ($migrator->getNotes() as $note) { $this->info($note);