configuration = $configuration; $this->connection = $connection; $this->aliasResolver = $aliasResolver; $this->migrationPlanCalculator = $migrationPlanCalculator; $this->metadataStorage = $metadataStorage; $this->statusCalculator = $statusCalculator; } /** * @param Version[] $versions */ public function listVersions(array $versions, OutputInterface $output): void { $table = new Table($output); $table->setHeaders( [ [new TableCell('Migration Versions', ['colspan' => 4])], ['Migration', 'Status', 'Migrated At', 'Execution Time', 'Description'], ] ); $executedMigrations = $this->metadataStorage->getExecutedMigrations(); $availableMigrations = $this->migrationPlanCalculator->getMigrations(); foreach ($versions as $version) { $description = null; $executedAt = null; $executionTime = null; if ($executedMigrations->hasMigration($version)) { $executedMigration = $executedMigrations->getMigration($version); $executionTime = $executedMigration->getExecutionTime(); $executedAt = $executedMigration->getExecutedAt() instanceof DateTimeInterface ? $executedMigration->getExecutedAt()->format('Y-m-d H:i:s') : null; } if ($availableMigrations->hasMigration($version)) { $description = $availableMigrations->getMigration($version)->getMigration()->getDescription(); } if ($executedMigrations->hasMigration($version) && $availableMigrations->hasMigration($version)) { $status = 'migrated'; } elseif ($executedMigrations->hasMigration($version)) { $status = 'migrated, not available'; } else { $status = 'not migrated'; } $table->addRow([ (string) $version, $status, (string) $executedAt, $executionTime !== null ? $executionTime . 's' : '', $description, ]); } $table->render(); } public function showMigrationsInfo(OutputInterface $output): void { $executedMigrations = $this->metadataStorage->getExecutedMigrations(); $availableMigrations = $this->migrationPlanCalculator->getMigrations(); $newMigrations = $this->statusCalculator->getNewMigrations(); $executedUnavailableMigrations = $this->statusCalculator->getExecutedUnavailableMigrations(); $storage = $this->configuration->getMetadataStorageConfiguration(); $table = new Table($output); $table->setHeaders( [ [new TableCell('Configuration', ['colspan' => 3])], ] ); $dataGroup = [ 'Storage' => [ 'Type' => $storage !== null ? get_class($storage) : null, ], 'Database' => [ 'Driver' => get_class($this->connection->getDriver()), 'Name' => $this->connection->getDatabase(), ], 'Versions' => [ 'Previous' => $this->getFormattedVersionAlias('prev', $executedMigrations), 'Current' => $this->getFormattedVersionAlias('current', $executedMigrations), 'Next' => $this->getFormattedVersionAlias('next', $executedMigrations), 'Latest' => $this->getFormattedVersionAlias('latest', $executedMigrations), ], 'Migrations' => [ 'Executed' => count($executedMigrations), 'Executed Unavailable' => count($executedUnavailableMigrations) > 0 ? ('' . count($executedUnavailableMigrations) . '') : '0', 'Available' => count($availableMigrations), 'New' => count($newMigrations) > 0 ? ('' . count($newMigrations) . '') : '0', ], 'Migration Namespaces' => $this->configuration->getMigrationDirectories(), ]; if ($storage instanceof TableMetadataStorageConfiguration) { $dataGroup['Storage'] += [ 'Table Name' => $storage->getTableName(), 'Column Name' => $storage->getVersionColumnName(), ]; } $first = true; foreach ($dataGroup as $group => $dataValues) { $nsRows = []; foreach ($dataValues as $k => $v) { $nsRows[] = [ $k, $v, ]; } if (count($nsRows) <= 0) { continue; } if (! $first) { $table->addRow([new TableSeparator(['colspan' => 3])]); } $first = false; array_unshift( $nsRows[0], new TableCell('' . $group . '', ['rowspan' => count($dataValues)]) ); $table->addRows($nsRows); } $table->render(); } private function getFormattedVersionAlias(string $alias, ExecutedMigrationsList $executedMigrations): string { try { $version = $this->aliasResolver->resolveVersionAlias($alias); } catch (Throwable $e) { $version = null; } // No version found if ($version === null) { if ($alias === 'next') { return 'Already at latest version'; } if ($alias === 'prev') { return 'Already at first version'; } } // Before first version "virtual" version number if ((string) $version === '0') { return '0'; } // Show normal version number return sprintf( '%s ', (string) $version ); } }