Estoy escribiendo un paquete de Laravel, en su proveedor de servicios, el paquete recibe una lista de migraciones para publicar, usando el siguiente código:
protected function publishMigrations(array $publishables): void { // Generate a list of migrations that have not been published yet. $migrations = []; foreach($publishables as $publishable) { // Migration already exists, continuing if(class_exists($publishable)){ continue; } $file = Str::snake($publishable) . '.php'; $migrations[self::MIGRATIONS_PATH . $file . '.stub'] = database_path('migrations/'.date('Y_m_d_His', time())."_$file"); } $this->publishes($migrations, 'migrations'); } Un ejemplo de los $publishables del paquete sería:
$publishables = ['CreateAuthenticationsTable', 'CreateCustomersTable', 'CreateTransactionsTable']; El código funciona como se esperaba, publicando las migraciones que tengo la intención de publicar, sin embargo, estoy tratando de evitar publicar la misma migración dos veces usando la class_exists($publishable) . Según entendí, Laravel MediaLibrary está utilizando el mismo enfoque. Pero supongo que las migraciones no se cargan al publicar activos porque ese fragmento de código nunca se ejecuta. (class_exists es falso todo el tiempo)
¿Hay alguna manera de hacer un seguimiento de las migraciones ya publicadas? ¿Se trata de un problema de carga automática?
Esta función migrationExists($mgr) verificará si existe un archivo de migración en la base de database/migrations . Recorrerá los nombres de los archivos de migración y buscará una coincidencia de nombre para el nombre de migración dado.
protected function publishMigrations() { if (!$this->migrationExists('create_admins_table')) { $this->publishes([ __DIR__ . '/database/migrations/create_admins_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_admins_table.php'), // you can add any number of migrations here ], 'migrations'); return; } } protected function migrationExists($mgr) { $path = database_path('migrations/'); $files = scandir($path); $pos = false; foreach ($files as &$value) { $pos = strpos($value, $mgr); if($pos !== false) return true; } return false; }