如何在Laravel中更改自动生成的迁移页面?

时间:2017-07-11 21:47:25

标签: php laravel laravel-5 migration

当我在Laravel中进行迁移时,它会自动显示如下:

public function up()
{
    Schema::create('comments', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
    });
}

但我希望工作更方便,我希望在创建和更新行时让数据库处理,而不是每次都自己处理。 我找到了一种方法,使这成为可能:

public function up()
{
    Schema::create('comments', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamp('created_at')->useCurrent();
        $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
    });
}

但现在每次我进行迁移时,我都需要手动更改它,我认为这不是很方便。有人知道如何在Laravel中更改自动生成的迁移吗?

2 个答案:

答案 0 :(得分:2)

如果你在源代码中挖掘,你会发现:

  1. 框架中有一个名为create.stub的文件。
  2. MigrationCreator使用此文件进行迁移。
  3. 原则上,您可以执行以下操作:

    1. 抓取内置的迁移文件并将其移动到项目的另一个文件夹中(例如,可能是resouces / stubs)请注意,即使您不能修改,也应该复制该文件夹中的其他存根它们。

    2. 然后,覆盖默认的迁移创建者以使用此文件,这应该有效:

      class MyMigrationCreator extends MigrationCreator {
            protected function stubPath() {
                   return base_path("resources"); //Or something valid         
            }
      }
      
    3. 然后在您的应用程序服务提供商中,您可以:

      $this->app->instance(MigrationCreator::class, resolve(MyMigrationCreator::class));
      

      这将(希望)"技巧" laravel使用您的迁移创建者而不是默认创建者。但是,创建表并不是经常发生的事情,以证明所有这些麻烦。

      更新:它应该扩展迁移创建者。

答案 1 :(得分:1)

在Laravel 5.6中,似乎无法覆盖MigrationCreator类,因为它直接在MigrationServiceProvider中使用:

protected function registerCreator() {
    $this->app->singleton('migration.creator', function ($app) {
        return new MigrationCreator($app['files']);
    });
}

但是您可以通过以下方式入侵MigrationServiceProvider:

  1. 在项目根目录中创建目录:overrides/Illuminate/Database
  2. 将文件vendor/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php复制到overrides/Illuminate/Database文件夹中(请注意,类名称空间将保持不变)
  3. 修改overrides/Illuminate/Database/MigrationServiceProvider.php

    protected function registerCreator() {
        $this->app->singleton('migration.creator', function ($app) {
             return new MyMigrationCreator($app['files']);
        });
    }
    
  4. 修改您的composer.json"Illuminate\\"):

    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/",
            "Illuminate\\": "overrides/Illuminate"
        }
    },
    
  5. 运行composer dump-autoload。作曲家会说

    `Warning: Ambiguous class resolution, "Illuminate\Database\MigrationServiceProvider" was found in both "$baseDir . '/overrides/Illuminate/Database/MigrationServiceProvider.php" and "/vendor/laravel/framework/src/Illuminate\Database\MigrationServiceProvider.php", the first will be used.`
    

现在将使用伪造的MigrationServiceProvider代替Laravel,但您将无法使用原始的MigrationCreator。这就是我们复制整个文件的原因。

实际上,您可以覆盖MyMigrationCreator类,但是代码量很大,实际上您需要使用stubPath()类扩展它,并覆盖create()之类的几种方法,也许MigrationServiceProvider。但是@Suspendable可以很安全地被覆盖,因为它包含一些小的方法,在Laravel 6之前不太可能会更改