看教程的時候發現,在執行
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 協議》,轉載必須註明作者和本文連結