[ 'mode' => 'argument', 'required' => true, 'description' => 'Migration name (e.g., CreatePostsTable)', ], 'module' => [ 'mode' => 'argument', 'required' => false, 'description' => 'Target module name (e.g., Blog). Optional if using create::migration', ], ]; public function handle(Input $input, Output $output): int { $module = null; if (preg_match('/^create:([^:]+):migration$/', $this->getName(), $matches)) { $module = $matches[1]; } if (!$module) { $module = $input->hasArgument('module') ? $input->getArgument('module') : null; } $module = trim((string) $module); $name = trim((string) $input->getArgument('name')); if ($module === '' || $name === '') { $output->writeln('Module and Name are required.'); return 1; } // Case-insensitive module directory lookup $modulesDir = getcwd() . '/modules'; $moduleDir = null; if (is_dir($modulesDir)) { foreach (scandir($modulesDir) as $dir) { if (strtolower($dir) === strtolower($module)) { $moduleDir = $modulesDir . '/' . $dir; $module = $dir; // Use actual casing break; } } } if (!$moduleDir || !is_dir($moduleDir)) { $output->writeln("Module '$module' does not exist."); return 1; } $migrationsDir = $moduleDir . '/Database/Migrations'; if (!is_dir($migrationsDir)) { @mkdir($migrationsDir, 0777, true); } $timestamp = date('Y_m_d_His'); $filename = $timestamp . '_' . strtolower(preg_replace('/(?writeln("Migration created at modules/$module/Database/Migrations/$filename"); return 0; } };