master

laravel/framework

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

MigrationCreator.php

TLDR

This file is a part of the Illuminate\Database\Migrations namespace in the Demo Projects project. It contains the MigrationCreator class, which is responsible for creating new migrations. It has various methods for creating and manipulating migration files.

Methods

__construct(Filesystem $files, $customStubPath)

This is the constructor method for the MigrationCreator class. It takes two parameters, $files of type Filesystem and $customStubPath of type string, and initializes the corresponding properties.

create($name, $path, $table = null, $create = false)

This method creates a new migration file at the given path. It takes four parameters: $name of type string, $path of type string, $table of type string or null, and $create of type boolean. It ensures that a migration with the same name doesn't already exist, gets the stub file for the migration, generates the path for the new migration file, saves the file with the populated stub content, and fires any post create hooks.

ensureMigrationDoesntAlreadyExist($name, $migrationPath = null)

This method ensures that a migration with the given name doesn't already exist. It takes two parameters: $name of type string and $migrationPath of type string or null. It checks if the migration file already exists in the specified migration path and throws an exception if it does.

getStub($table, $create)

This method gets the appropriate stub file for the migration based on the provided table and create flags. It takes two parameters: $table of type string or null and $create of type boolean. It determines the stub file based on the table and create flags and returns the content of the stub file.

populateStub($stub, $table)

This method populates the placeholders in the migration stub with the provided table name. It takes two parameters: $stub of type string and $table of type string or null. It replaces the placeholders in the stub with the provided table name and returns the populated stub content.

getClassName($name)

This method generates the class name based on the provided migration name. It takes one parameter: $name of type string and uses the Str::studly method from the Illuminate\Support\Str class to convert the migration name to a studly case string.

getPath($name, $path)

This method generates the full path for the new migration file based on the provided name and path parameters. It takes two parameters: $name of type string and $path of type string and returns the full path string.

firePostCreateHooks($table, $path)

This method fires any registered post create hooks with the provided table name and path. It takes two parameters: $table of type string or null and $path of type string. It iterates over the registered post create callbacks and calls each of them with the table name and path as parameters.

afterCreate(Closure $callback)

This method registers a post migration create hook. It takes one parameter: $callback of type Closure. It adds the provided callback to the postCreate array for later execution.

getDatePrefix()

This method returns the date prefix for the migration in the format "Y_m_d_His". It takes no parameters and uses the date function to generate the current date and time in a specific format.

stubPath()

This method returns the path to the stub files for the migrations. It takes no parameters and returns a string representing the path.

getFilesystem()

This method returns the Filesystem instance used by the MigrationCreator class. It takes no parameters and returns the files property.

<?php

namespace Illuminate\Database\Migrations;

use Closure;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Str;
use InvalidArgumentException;

class MigrationCreator
{
    /**
     * The filesystem instance.
     *
     * @var \Illuminate\Filesystem\Filesystem
     */
    protected $files;

    /**
     * The custom app stubs directory.
     *
     * @var string
     */
    protected $customStubPath;

    /**
     * The registered post create hooks.
     *
     * @var array
     */
    protected $postCreate = [];

    /**
     * Create a new migration creator instance.
     *
     * @param  \Illuminate\Filesystem\Filesystem  $files
     * @param  string  $customStubPath
     * @return void
     */
    public function __construct(Filesystem $files, $customStubPath)
    {
        $this->files = $files;
        $this->customStubPath = $customStubPath;
    }

    /**
     * Create a new migration at the given path.
     *
     * @param  string  $name
     * @param  string  $path
     * @param  string|null  $table
     * @param  bool  $create
     * @return string
     *
     * @throws \Exception
     */
    public function create($name, $path, $table = null, $create = false)
    {
        $this->ensureMigrationDoesntAlreadyExist($name, $path);

        // First we will get the stub file for the migration, which serves as a type
        // of template for the migration. Once we have those we will populate the
        // various place-holders, save the file, and run the post create event.
        $stub = $this->getStub($table, $create);

        $path = $this->getPath($name, $path);

        $this->files->ensureDirectoryExists(dirname($path));

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

        // Next, we will fire any hooks that are supposed to fire after a migration is
        // created. Once that is done we'll be ready to return the full path to the
        // migration file so it can be used however it's needed by the developer.
        $this->firePostCreateHooks($table, $path);

        return $path;
    }

    /**
     * Ensure that a migration with the given name doesn't already exist.
     *
     * @param  string  $name
     * @param  string  $migrationPath
     * @return void
     *
     * @throws \InvalidArgumentException
     */
    protected function ensureMigrationDoesntAlreadyExist($name, $migrationPath = null)
    {
        if (! empty($migrationPath)) {
            $migrationFiles = $this->files->glob($migrationPath.'/*.php');

            foreach ($migrationFiles as $migrationFile) {
                $this->files->requireOnce($migrationFile);
            }
        }

        if (class_exists($className = $this->getClassName($name))) {
            throw new InvalidArgumentException("A {$className} class already exists.");
        }
    }

    /**
     * Get the migration stub file.
     *
     * @param  string|null  $table
     * @param  bool  $create
     * @return string
     */
    protected function getStub($table, $create)
    {
        if (is_null($table)) {
            $stub = $this->files->exists($customPath = $this->customStubPath.'/migration.stub')
                            ? $customPath
                            : $this->stubPath().'/migration.stub';
        } elseif ($create) {
            $stub = $this->files->exists($customPath = $this->customStubPath.'/migration.create.stub')
                            ? $customPath
                            : $this->stubPath().'/migration.create.stub';
        } else {
            $stub = $this->files->exists($customPath = $this->customStubPath.'/migration.update.stub')
                            ? $customPath
                            : $this->stubPath().'/migration.update.stub';
        }

        return $this->files->get($stub);
    }

    /**
     * Populate the place-holders in the migration stub.
     *
     * @param  string  $stub
     * @param  string|null  $table
     * @return string
     */
    protected function populateStub($stub, $table)
    {
        // Here we will replace the table place-holders with the table specified by
        // the developer, which is useful for quickly creating a tables creation
        // or update migration from the console instead of typing it manually.
        if (! is_null($table)) {
            $stub = str_replace(
                ['DummyTable', '{{ table }}', '{{table}}'],
                $table, $stub
            );
        }

        return $stub;
    }

    /**
     * Get the class name of a migration name.
     *
     * @param  string  $name
     * @return string
     */
    protected function getClassName($name)
    {
        return Str::studly($name);
    }

    /**
     * Get the full path to the migration.
     *
     * @param  string  $name
     * @param  string  $path
     * @return string
     */
    protected function getPath($name, $path)
    {
        return $path.'/'.$this->getDatePrefix().'_'.$name.'.php';
    }

    /**
     * Fire the registered post create hooks.
     *
     * @param  string|null  $table
     * @param  string  $path
     * @return void
     */
    protected function firePostCreateHooks($table, $path)
    {
        foreach ($this->postCreate as $callback) {
            $callback($table, $path);
        }
    }

    /**
     * Register a post migration create hook.
     *
     * @param  \Closure  $callback
     * @return void
     */
    public function afterCreate(Closure $callback)
    {
        $this->postCreate[] = $callback;
    }

    /**
     * Get the date prefix for the migration.
     *
     * @return string
     */
    protected function getDatePrefix()
    {
        return date('Y_m_d_His');
    }

    /**
     * Get the path to the stubs.
     *
     * @return string
     */
    public function stubPath()
    {
        return __DIR__.'/stubs';
    }

    /**
     * Get the filesystem instance.
     *
     * @return \Illuminate\Filesystem\Filesystem
     */
    public function getFilesystem()
    {
        return $this->files;
    }
}