make:migration 的騷操作

W-W發表於2019-03-23

看教程的時候發現,在執行 php aritsan make:migration add_extra_to_users_table 的時候並沒有指定表名,但是生成的遷移檔案確是指定表名 users 的。不明所以,這是什麼操作?本想提問,算了,還是先翻翻原始碼吧,果不其然,被我找到了

首先找到了 writeMigration(),該方法作用是將生成的遷移檔案寫入磁碟。
Illuminate/Database/Console/Migrations/MigrateMakeCommand.php

.
.
/**
 * 將遷移檔案寫入磁碟。
 *
 * @param  string  $name
 * @param  string  $table
 * @param  bool    $create
 * @return string
 */
protected function writeMigration($name, $table, $create)
{
    $file = pathinfo($this->creator->create(
        $name, $this->getMigrationPath(), $table, $create
    ), PATHINFO_FILENAME);
    $this->line("<info>Created Migration:</info> {$file}");
}
.
.

該方法接收三個引數,其中第二個引數 $table 為表名,這就是我要找的為什麼該條命令針對的是 users 表。找到該方法的呼叫處--也就是該檔案的 handle() 方法:

.
.
/**
 * 執行命令.
 *
 * @return void
 */
public function handle()
{
    // 從命令輸入中獲取檔名
    $name = Str::snake(trim($this->input->getArgument('name')));
    // 從命令輸入中獲取 table 引數值
    $table = $this->input->getOption('table');
    // 從命令輸入中獲取 create 引數值
    $create = $this->input->getOption('create') ?: false;
    // 如果 table 值不存在,則把 create 賦值給 table
    if (! $table && is_string($create)) {
        $table = $create;
        $create = true;
    }
    if (! $table) {
        [$table, $create] = TableGuesser::guess($name);
    }
    $this->writeMigration($name, $table, $create);
    $this->composer->dumpAutoloads();
}
.
.

很顯然,呼叫了 TableGuesser::guess($name),找到檔案:
Illuminate/Database/Console/Migrations/TableGuesser.php

.
.
class TableGuesser
{
    const CREATE_PATTERNS = [
        '/^create_(\w+)_table$/',
        '/^create_(\w+)$/',
    ];
    const CHANGE_PATTERNS = [
        '/_(to|from|in)_(\w+)_table$/',
        '/_(to|from|in)_(\w+)$/',
    ];
    /**
     * 嘗試猜測給定遷移的表名和"建立"狀態
     *
     * @param  string  $migration
     * @return array
     */
    public static function guess($migration)
    {
        foreach (self::CREATE_PATTERNS as $pattern) {
            if (preg_match($pattern, $migration, $matches)) {
                return [$matches[1], $create = true];
            }
        }
        foreach (self::CHANGE_PATTERNS as $pattern) {
            if (preg_match($pattern, $migration, $matches)) {
                return [$matches[2], $create = false];
            }
        }
    }
}

哦吼,原來是匹配了命令輸入的 add_extra_to_users_table
嗯,約定優於配置 真的可以省很多事啊

本作品採用《CC 協議》,轉載必須註明作者和本文連結
:computer: & :coffee:

相關文章