package->discoversMigrations) { $this->discoverPackageMigrations(); return $this; } $now = Carbon::now(); foreach ($this->package->migrationFileNames as $migrationFileName) { $vendorMigration = $this->package->basePath("/../database/migrations/{$migrationFileName}.php"); // Support for the .stub file extension if (! file_exists($vendorMigration)) { $vendorMigration .= '.stub'; } if ($this->app->runningInConsole()) { $appMigration = $this->generateMigrationName($migrationFileName, $now->addSecond()); $this->publishes( [$vendorMigration => $appMigration], "{$this->package->shortName()}-migrations" ); } if ($this->package->runsMigrations) { $this->loadMigrationsFrom($vendorMigration); } } return $this; } protected function discoverPackageMigrations(): void { $now = Carbon::now(); $migrationsPath = trim($this->package->migrationsPath, '/'); $files = (new Filesystem())->files($this->package->basePath("/../{$migrationsPath}")); foreach ($files as $file) { $filePath = $file->getPathname(); $migrationFileName = Str::replace(['.stub', '.php'], '', $file->getFilename()); // Publish but do not add timestamp to non migration files if (Str::endsWith($filePath, [".php", ".php.stub"])) { $appMigration = $this->generateMigrationName($migrationFileName, $now->addSecond()); } else { $appMigration = database_path("migrations/{$file->getFilename()}"); } if ($this->app->runningInConsole()) { $this->publishes( [$filePath => $appMigration], "{$this->package->shortName()}-migrations" ); } // Do not load non migration files if ($this->package->runsMigrations && Str::endsWith($filePath, [".php", ".php.stub"])) { $this->loadMigrationsFrom($filePath); } } } protected function generateMigrationName(string $migrationFileName, Carbon|CarbonImmutable $now): string { $migrationsPath = 'migrations/' . dirname($migrationFileName) . '/'; $migrationFileName = basename($migrationFileName); $len = strlen($migrationFileName) + 4; if (Str::contains($migrationFileName, '/')) { $migrationsPath .= Str::of($migrationFileName)->beforeLast('/')->finish('/'); $migrationFileName = Str::of($migrationFileName)->afterLast('/'); } foreach (glob(database_path("{$migrationsPath}*.php")) as $filename) { if ((substr($filename, -$len) === $migrationFileName . '.php')) { return $filename; } } $migrationFileName = self::stripTimestampPrefix($migrationFileName); $timestamp = $now->format('Y_m_d_His'); $formattedFileName = Str::of($migrationFileName)->snake()->finish('.php'); return database_path("{$migrationsPath}{$timestamp}_{$formattedFileName}"); } private static function stripTimestampPrefix(string $filename): string { return preg_replace('/^\d{4}_\d{2}_\d{2}_\d{6}_/', '', $filename); } }