Files
glastree/vendor/spatie/laravel-package-tools/src/Concerns/PackageServiceProvider/ProcessMigrations.php
T

109 lines
3.7 KiB
PHP
Raw Normal View History

2026-05-26 08:14:29 +02:00
<?php
namespace Spatie\LaravelPackageTools\Concerns\PackageServiceProvider;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Str;
trait ProcessMigrations
{
protected function bootPackageMigrations(): self
{
if ($this->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);
}
}