#!/usr/bin/env php
<?php
// Check if the migration name is provided as an argument
if ($argc < 2) {
print "Usage: make_migration.php <migration_name>\n";
exit(1);
}
// Get the migration name and sanitize it
$migrationName = preg_replace('/[^a-zA-Z0-9_]/', '', $argv[1]);
if (!$migrationName) {
print "Invalid migration name. Only alphanumeric and underscore characters are allowed.\n";
exit(1);
}
function toPascalCase($string) {
// Convert underscores to spaces, capitalize each word, then remove spaces
return str_replace(' ', '', ucwords(str_replace('_', ' ', $string)));
}
function extractTableName($string) {
// Regular expression to capture the middle part between `create_` and `_table`
if (preg_match('/^create_(.*)_table$/', $string, $matches)) {
return $matches[1];
}
return null; // Return null if the pattern doesn't match
}
// Generate a timestamp for the migration file
$timestamp = date('Y_m_d_His');
$filename = $timestamp . '_' . $migrationName . '.php';
$filepath = __DIR__ . '/../migrations/' . $filename;
// Table name extraction
$tableName = extractTableName($migrationName);
// Class name convertion
$className = toPascalCase($migrationName);
// Template for the migration file content
$template = <<<EOT
<?php
// migrations/$filename
namespace Migrations;
use App\Schemas\MigrationInterface;
use App\Schemas\Schema;
class $className implements MigrationInterface {
public static function up() {
Schema::createTable('$tableName', [
'id' => 'INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY',
'created_at' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP',
'updated_at' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
]);
}
public static function down() {
Schema::dropTable('$tableName');
}
}
EOT;
// Write the template to a new file in the migrations directory
if (file_put_contents($filepath, $template) !== false) {
print "Migration file created: $filepath\n";
} else {
print "Failed to create migration file.\n";
}
// chmod +x cli/make_migration.php
// ./cli/make_migration.php create_users_table
|