【问题标题】:How to automatically run the migrations in a Laravel package?如何在 Laravel 包中自动运行迁移?
【发布时间】:2013-05-24 23:17:12
【问题描述】:

我刚刚在 Laravel 4 应用程序中安装了 Cartalyst 的 Sentry 2,但我发现我必须通过指定 --package=cartalyst/sentry 来单独运行该包的迁移,这使得自动部署变得不可能。

有没有办法运行 php artisan migrate 并让它也运行 Sentry 的迁移?

【问题讨论】:

  • 我能想到的唯一方法是自定义您自己的工匠命令来尝试从包中加载尽可能多的迁移。 L4(据我所知)不支持这一点,可能是由于人们安装包然后将迁移迁移到可能删除现有表的包的安全问题。
  • 我不确定我是否遵循,但如果您担心可能会删除现有表的包迁移,那么如果 Laravel 需要一个“--package”参数来运行它们,这不会有任何区别或者如果它们可以简单地使用php artisan migrate 运行。如果您担心,请先阅读包迁移。关键在于易用性。我不记得 Rails 是如何做到的,但 Django 允许您运行所有可用的迁移,包括您自己的和任何已安装的软件包。必须为每个包手动运行迁移没有多大意义,而且会浪费时间。
  • 另外,如果 Laravel 能够实现我前段时间建议的一些东西:数据库中的包的“命名空间”,则可以减轻安全隐患。 Django 创建每个表,其前缀是迁移所属包的名称。这不仅解决了第三方迁移删除您自己的一个表的潜在安全问题,而且解决了一个包需要创建与另一个包同名的表时的表名冲突问题。
  • 如果有人好奇,这是我对数据库表添加“命名空间”(前缀)的原始建议:github.com/laravel/framework/issues/3265
  • L4.x 和 L5.x 有所不同也许这有帮助:stackoverflow.com/a/46714177/3256489

标签: laravel laravel-4


【解决方案1】:

在这种情况下,我通常会通过以下命令发布包迁移:

php artisan migrate:publish vendor/package

这会将迁移文件从任何给定包复制到您的迁移文件夹。

【讨论】:

  • 确实如此,但这也意味着您每次更新包时都需要这样做,以确保您不会错过任何新的迁移,这再次使自动部署比他们需要。
  • 应该是php artisan vendor:publish vendor/package
【解决方案2】:

在 Laravel 5 之后有更好的方法来解决这个问题:

在包中创建您的迁移 /数据库/迁移文件夹 . 之后,在包的服务提供者中创建一个引导方法,引用迁移文件夹

public function boot()
{
    $this->loadMigrationsFrom(__DIR__ . 
    '/database/migrations');
}

现在,在顶层文件夹(需要此包的主应用程序)上,您可以运行默认的迁移命令( php artisan migrate ),它会自动找到通过迁移的包loadMigrationsFrom 方法

答案复制自: http://voerro.com/en/tutorials/r/developing-and-distributing-laravel-5-packages/3

【讨论】:

  • 感谢改进的答案。 :) 为什么它仍然需要你做额外的工作(boot() 函数),而不是仅仅检测包中的迁移并运行它们?
  • 我真的不知道为什么。有道理它总有一天会成为默认行为。
【解决方案3】:

我创建了一个 composer 脚本来替换 php artisan migrate .....。该脚本同时运行我的迁移和供应商的迁移。

我的作曲家脚本是

"scripts": {
    "migrate": [
        "php artisan migrate --env=$LARAVEL_ENV",
        "php artisan migrate --package=\"cartalyst/sentry\" --env=$LARAVEL_ENV",
        "php artisan migrate --package=\"mrjuliuss/syntara\" --env=$LARAVEL_ENV",
        "php artisan migrate --package=\"filmoteca/static-pages\" --env=$LARAVEL_ENV"
    ]
}

然后您可以使用LARAVEL_ENV=prod composer run-script migrate 运行迁移

要将参数传递给脚本,我使用环境变量。在前面的示例中,我将环境变量 LARAVEL_ENV 设置为 prod,因此迁移使用生产数据库连接。

您始终可以在本地计算机中创建别名来缩短命令。例如alias migrate="LARAVEL_ENV=local composer run-script migrate"

我认为这种方法很好,因为当您要向composer.json 添加一个新包并且该包具有迁移时,您可以将包和包的迁移添加到同一个文件中。所以,不要忘记添加/删除包的迁移。

这是带有脚本的完整composer.json

【讨论】:

  • 我想我做了类似的事情,但就像其他所有解决方案一样,这是不必要的额外工作。谢天谢地,我几乎不记得这一点,因为我已经转向更绿色的牧场(即远离 PHP)。
【解决方案4】:

第 3 方包必须声明一个服务提供者,即声明迁移。

你可以在https://github.com/laravel/passport/blob/9.x/src/PassportServiceProvider.php#L80看到:

protected function registerMigrations()
    {
        if (Passport::$runsMigrations && ! config('passport.client_uuids')) {
            return $this->loadMigrationsFrom(__DIR__.'/../database/migrations');
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2015-08-28
    • 2021-07-08
    相关资源
    最近更新 更多