Blame | Letzte Änderung | Log anzeigen | RSS feed
<?phpnamespace Illuminate\Foundation\Testing;use Illuminate\Contracts\Console\Kernel;use Illuminate\Foundation\Testing\Traits\CanConfigureMigrationCommands;trait RefreshDatabase{use CanConfigureMigrationCommands;/*** Define hooks to migrate the database before and after each test.** @return void*/public function refreshDatabase(){$this->beforeRefreshingDatabase();$this->usingInMemoryDatabase()? $this->refreshInMemoryDatabase(): $this->refreshTestDatabase();$this->afterRefreshingDatabase();}/*** Determine if an in-memory database is being used.** @return bool*/protected function usingInMemoryDatabase(){$default = config('database.default');return config("database.connections.$default.database") === ':memory:';}/*** Refresh the in-memory database.** @return void*/protected function refreshInMemoryDatabase(){$this->artisan('migrate', $this->migrateUsing());$this->app[Kernel::class]->setArtisan(null);}/*** The parameters that should be used when running "migrate".** @return array*/protected function migrateUsing(){return ['--seed' => $this->shouldSeed(),'--seeder' => $this->seeder(),];}/*** Refresh a conventional test database.** @return void*/protected function refreshTestDatabase(){if (! RefreshDatabaseState::$migrated) {$this->artisan('migrate:fresh', $this->migrateFreshUsing());$this->app[Kernel::class]->setArtisan(null);RefreshDatabaseState::$migrated = true;}$this->beginDatabaseTransaction();}/*** Begin a database transaction on the testing database.** @return void*/public function beginDatabaseTransaction(){$database = $this->app->make('db');foreach ($this->connectionsToTransact() as $name) {$connection = $database->connection($name);$dispatcher = $connection->getEventDispatcher();$connection->unsetEventDispatcher();$connection->beginTransaction();$connection->setEventDispatcher($dispatcher);if ($this->app->resolved('db.transactions')) {$this->app->make('db.transactions')->callbacksShouldIgnore($this->app->make('db.transactions')->getTransactions()->first());}}$this->beforeApplicationDestroyed(function () use ($database) {foreach ($this->connectionsToTransact() as $name) {$connection = $database->connection($name);$dispatcher = $connection->getEventDispatcher();$connection->unsetEventDispatcher();$connection->rollBack();$connection->setEventDispatcher($dispatcher);$connection->disconnect();}});}/*** The database connections that should have transactions.** @return array*/protected function connectionsToTransact(){return property_exists($this, 'connectionsToTransact')? $this->connectionsToTransact : [null];}/*** Perform any work that should take place before the database has started refreshing.** @return void*/protected function beforeRefreshingDatabase(){// ...}/*** Perform any work that should take place once the database has finished refreshing.** @return void*/protected function afterRefreshingDatabase(){// ...}}