【问题标题】:How to run module migrations programatically in FuelPHP?如何在 FuelPHP 中以编程方式运行模块迁移?
【发布时间】:2015-07-16 13:02:07
【问题描述】:

对于我的一些测试,我需要 setUpBeforeClass 方法对存在的任何模块运行迁移,并使用 tearDownAfterClass 再次将模块迁移回来。通过命令行很容易做到这一点:

oil r migrate --modules

...运行模块迁移,然后:

oil r migrate --modules --version=0

...重置它们。但是,在测试中我需要以编程方式执行此操作,并且我无法弄清楚如何使用 FuelPHP 的 Migrate 类执行上述命令。 latestversion 方法似乎都要求您指定模块名称,但我只想迁移存在的任何模块。这可能吗?

【问题讨论】:

    标签: phpunit tdd database-migration fuelphp


    【解决方案1】:

    您需要一些技巧才能使其正常工作。

    这是油的作用方式:

    https://github.com/fuel/core/blob/1.8/develop/tasks/migrate.php#L101

    您也可以使用Module::loaded() 来获取加载的模块。

    然后您可以为每个模块运行迁移。

    【讨论】:

    • 嗯,这很奇怪。你知道是否有办法通过石油来做到这一点 - 例如。 Oil\Refine::run('import', array('--modules')? (我试过了,它似乎不起作用,但感觉可能有一个解决方案......)
    • 好吧,我不会乱用Oil,但我确定import不是迁移的任务名称,它是迁移。我宁愿跳过石油并使用我上面提到的方法:获取模块名称,然后为每个模块调用 migrate。或者,您也可以使用exec 调用石油。
    • 啊,抱歉,这是一个剪切粘贴错误。我的意思是Oil\Refine::run('migrate', array('--module'));。 “导入”是我编写的一项任务,我确实在我的一个测试中像这样运行 Oil 来测试导入任务,所以我知道它可以工作。无法让它与“迁移”一起使用......
    • 正如@WanWizard 所说,你应该在你的代码中使用 Migrate 而不是 hacking oil。
    • 我愿意!但我不知道怎么做——因此是这个问题! :) 我不认为像这样以编程方式调用 Oil 真的是“破解”它——我没有触及 Oil 代码库中的任何内容:只是调用它的公开可用方法。如果这样可行,我认为在测试的setUp 方法中执行此操作没有任何问题——这相当于运行油命令。
    【解决方案2】:

    迁移由 Migrate 类运行,因此如果您想运行迁移,可以在代码中使用它:

    $results = Migrate::up(null, 'mymodulename', 'module');
    

    与任务类似,您也可以使用 down() 和 current()。

    请注意,这不会加载模块,因此如果您的模块迁移需要模块中的类,请确保先加载模块!

    【讨论】:

    • 谢谢。问题是,您必须在此处命名模块,并且我想以通用方式编写它(因为我想运行相同的测试套件,尽管可能存在不同的模块)。上面的石油命令似乎完美地做到了这一点——有没有办法使用 Migrate 来达到同样的效果? (即运行/恢复存在的 任何 模块迁移)
    • 请阅读我的回答。有办法。再次:获取所有模块(通用)的列表并为它们运行迁移。
    • @mark.sagikazar: Module::loaded() 在我的情况下不起作用 - 它返回一个空数组 - 因为该模块只包含一些无法进入应用程序的特定于实例的迁移本身。所以模块实际上并没有加载到代码中。
    • 如何查看模块路径,如链接的油参考中所示?您可以在代码中重新创建 oil 执行的步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2022-06-11
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多