From 04e66e118d478d69043c9548da97954e87d244da Mon Sep 17 00:00:00 2001 From: Antonio Pauletich Date: Tue, 31 Jul 2018 20:17:50 +0200 Subject: [PATCH] Services can be injected in migrations --- .../Database/MigrationServiceProvider.php | 2 +- .../Database/Migrations/Migrator.php | 31 +++++++++++----- .../DatabaseMigratorIntegrationTest.php | 25 ++++++++++++- .../2018_07_31_000000_create_test_table.php | 37 +++++++++++++++++++ 4 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 tests/Database/migrations/three/2018_07_31_000000_create_test_table.php diff --git a/src/Illuminate/Database/MigrationServiceProvider.php b/src/Illuminate/Database/MigrationServiceProvider.php index a8b92ab6e481..68a9d81c847d 100755 --- a/src/Illuminate/Database/MigrationServiceProvider.php +++ b/src/Illuminate/Database/MigrationServiceProvider.php @@ -57,7 +57,7 @@ protected function registerMigrator() $this->app->singleton('migrator', function ($app) { $repository = $app['migration.repository']; - return new Migrator($repository, $app['db'], $app['files']); + return new Migrator($app, $repository, $app['db'], $app['files']); }); } diff --git a/src/Illuminate/Database/Migrations/Migrator.php b/src/Illuminate/Database/Migrations/Migrator.php index 66cda4499dbb..34e8f56c7f75 100755 --- a/src/Illuminate/Database/Migrations/Migrator.php +++ b/src/Illuminate/Database/Migrations/Migrator.php @@ -7,6 +7,7 @@ use Illuminate\Support\Collection; use Illuminate\Console\OutputStyle; use Illuminate\Filesystem\Filesystem; +use Illuminate\Contracts\Container\Container; use Illuminate\Database\ConnectionResolverInterface as Resolver; class Migrator @@ -54,17 +55,27 @@ class Migrator protected $output; /** - * Create a new migrator instance. + * The IoC container instance. * - * @param \Illuminate\Database\Migrations\MigrationRepositoryInterface $repository - * @param \Illuminate\Database\ConnectionResolverInterface $resolver - * @param \Illuminate\Filesystem\Filesystem $files - * @return void + * @var \Illuminate\Container\Container */ - public function __construct(MigrationRepositoryInterface $repository, - Resolver $resolver, - Filesystem $files) - { + protected $container; + + /** + * Create a new migrator instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @param \Illuminate\Database\Migrations\MigrationRepositoryInterface $repository + * @param \Illuminate\Database\ConnectionResolverInterface $resolver + * @param \Illuminate\Filesystem\Filesystem $files + */ + public function __construct( + Container $container, + MigrationRepositoryInterface $repository, + Resolver $resolver, + Filesystem $files + ) { + $this->container = $container; $this->files = $files; $this->resolver = $resolver; $this->repository = $repository; @@ -357,7 +368,7 @@ protected function runMigration($migration, $method) $callback = function () use ($migration, $method) { if (method_exists($migration, $method)) { - $migration->{$method}(); + $this->container->call([$migration, $method]); } }; diff --git a/tests/Database/DatabaseMigratorIntegrationTest.php b/tests/Database/DatabaseMigratorIntegrationTest.php index d13da9d25aa8..420266b45fe8 100644 --- a/tests/Database/DatabaseMigratorIntegrationTest.php +++ b/tests/Database/DatabaseMigratorIntegrationTest.php @@ -6,14 +6,24 @@ use Illuminate\Support\Str; use PHPUnit\Framework\TestCase; use Illuminate\Filesystem\Filesystem; +use Illuminate\Database\Schema\Builder; +use Illuminate\Database\DatabaseManager; use Illuminate\Database\Migrations\Migrator; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Migrations\DatabaseMigrationRepository; class DatabaseMigratorIntegrationTest extends TestCase { + /** + * @var \Illuminate\Database\Capsule\Manager + */ protected $db; + /** + * @var \Illuminate\Database\Migrations\Migrator + */ + protected $migrator; + /** * Bootstrap Eloquent. * @@ -31,10 +41,14 @@ public function setUp() $db->setAsGlobal(); $container = new \Illuminate\Container\Container; - $container->instance('db', $db->getDatabaseManager()); + $databaseManager = $db->getDatabaseManager(); + $container->instance('db', $databaseManager); + $container->instance(DatabaseManager::class, $databaseManager); + $container->instance(Builder::class, $databaseManager->getSchemaBuilder()); \Illuminate\Support\Facades\Facade::setFacadeApplication($container); $this->migrator = new Migrator( + $container, $repository = new DatabaseMigrationRepository($db->getDatabaseManager(), 'migrations'), $db->getDatabaseManager(), new Filesystem @@ -143,4 +157,13 @@ public function testMigrationsCanBeResetAcrossMultiplePaths() $this->assertFalse($this->db->schema()->hasTable('password_resets')); $this->assertFalse($this->db->schema()->hasTable('flights')); } + + public function testServicesCanBeInjectedInTheMigrationMethods() + { + $this->migrator->run([__DIR__.'/migrations/three']); + $this->assertTrue($this->db->schema()->hasTable('test')); + $this->assertSame(1, $this->db->getConnection()->table('test')->where('name', '=', 'PirateKing')->count()); + $this->migrator->rollback([__DIR__.'/migrations/three']); + $this->assertFalse($this->db->schema()->hasTable('test')); + } } diff --git a/tests/Database/migrations/three/2018_07_31_000000_create_test_table.php b/tests/Database/migrations/three/2018_07_31_000000_create_test_table.php new file mode 100644 index 000000000000..bef1f0b11603 --- /dev/null +++ b/tests/Database/migrations/three/2018_07_31_000000_create_test_table.php @@ -0,0 +1,37 @@ +create('test', function (Blueprint $table) { + $table->increments('id'); + $table->string('name'); + }); + + $databaseManager->table('test')->insert(['name' => 'PirateKing']); + } + + /** + * Reverse the migrations. + * + * @param Builder $builder + * @return void + */ + public function down(Builder $builder) + { + $builder->dropIfExists('test'); + } +}