master

laravel/framework

Last updated at: 29/12/2023 09:21

MigrationGeneratorCommand.php

TLDR

This file contains the MigrationGeneratorCommand class, which is an abstract class that provides common functionality for generating migration files in Laravel projects.

Methods

handle

This method is responsible for executing the console command. It checks if a migration for the specified table already exists, and if not, it creates a base migration file and replaces the placeholders in the migration stub file. It returns an integer indicating the exit code of the command.

createBaseMigration

This method creates a base migration file for the specified table. It uses the Laravel migration.creator service to generate the migration file with a name based on the table name. The migration file is created in the Laravel database migrations path.

replaceMigrationPlaceholders

This method replaces the placeholders in the generated migration file with the actual table name. It reads the contents of the migration stub file, replaces the {{table}} placeholder with the specified table name, and saves the modified contents to the specified path.

migrationExists

This method determines whether a migration for the specified table already exists. It searches for migration files in the Laravel database migrations path that match the naming convention of Laravel migration files for the specified table.

Classes

None

<?php

namespace Illuminate\Console;

use Illuminate\Filesystem\Filesystem;

use function Illuminate\Filesystem\join_paths;

abstract class MigrationGeneratorCommand extends Command
{
    /**
     * The filesystem instance.
     *
     * @var \Illuminate\Filesystem\Filesystem
     */
    protected $files;

    /**
     * Create a new migration generator command instance.
     *
     * @param  \Illuminate\Filesystem\Filesystem  $files
     * @return void
     */
    public function __construct(Filesystem $files)
    {
        parent::__construct();

        $this->files = $files;
    }

    /**
     * Get the migration table name.
     *
     * @return string
     */
    abstract protected function migrationTableName();

    /**
     * Get the path to the migration stub file.
     *
     * @return string
     */
    abstract protected function migrationStubFile();

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $table = $this->migrationTableName();

        if ($this->migrationExists($table)) {
            $this->components->error('Migration already exists.');

            return 1;
        }

        $this->replaceMigrationPlaceholders(
            $this->createBaseMigration($table), $table
        );

        $this->components->info('Migration created successfully.');

        return 0;
    }

    /**
     * Create a base migration file for the table.
     *
     * @param  string  $table
     * @return string
     */
    protected function createBaseMigration($table)
    {
        return $this->laravel['migration.creator']->create(
            'create_'.$table.'_table', $this->laravel->databasePath('/migrations')
        );
    }

    /**
     * Replace the placeholders in the generated migration file.
     *
     * @param  string  $path
     * @param  string  $table
     * @return void
     */
    protected function replaceMigrationPlaceholders($path, $table)
    {
        $stub = str_replace(
            '{{table}}', $table, $this->files->get($this->migrationStubFile())
        );

        $this->files->put($path, $stub);
    }

    /**
     * Determine whether a migration for the table already exists.
     *
     * @param  string  $table
     * @return bool
     */
    protected function migrationExists($table)
    {
        return count($this->files->glob(
            join_paths($this->laravel->databasePath('migrations'), '*_*_*_*_create_'.$table.'_table.php')
        )) !== 0;
    }
}