【问题标题】:Run migration script via Controller Symfony2通过 Controller Symfony2 运行迁移脚本
【发布时间】:2016-01-14 20:44:58
【问题描述】:

在 Symfony2 项目中使用了 2 个数据库,并且有一个迁移脚本放置在位置

app/DoctrineMigrations/codes/Version20150914201128.php

此迁移不适用于默认数据库,它适用于使用的第二个数据库。

需要在用户选择时运行迁移脚本。在某些操作上会打开一个弹出窗口,如果用户选择“是”,那么我只需要运行该迁移脚本。

那么在 Symfony2 中通过 Controller 或 Service 运行迁移脚本是否可行或正确?

【问题讨论】:

  • 您能详细解释一下您的问题或您的目标吗?我不明白你
  • @darkomen 我已经更新了我的问题。请立即检查。

标签: symfony


【解决方案1】:

看看这个例子。您可以从控制器操作轻松触发教义迁移命令。

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;

class SpoolController extends Controller
{
    public function migrateAction($entity_manager = 'default')
    {
        $kernel = $this->get('kernel');
        $application = new Application($kernel);
        $application->setAutoExit(false);

        $input = new ArrayInput(array(
           'command' => 'doctrine:migrations:migrate',
           '--em' => $entity_manager,
        ));
        // You can use NullOutput() if you don't need the output
        $output = new BufferedOutput();
        $application->run($input, $output);

        // return the output, don't use if you used NullOutput()
        $content = $output->fetch();

        // return new Response(""), if you used NullOutput()
        return new Response($content);
    }
}

这个略有改动的示例取自文档章节 How to trigger a Command from a Controller

【讨论】:

  • 谢谢,我研究了这个例子。但如前所述,有 2 个数据库,那么如何使用这个选择数据库?
  • 您可以使用doctrine:migrations:migrate 命令的--em 选项。然后只需设置多个实体管理器......每个数据库一个。如何做到这一点将是一个单独的问题。
  • 看看 DoctrineBundle 的 configuration reference 中的 doctrine.orm.entity_managers 配置指令。这很容易理解。
  • 我可以传递一个新的实体管理器,而不是使用 --em 名称,如下所示:$newEntityManager = \Doctrine\ORM\EntityManager::create( $new_connection, $codesConf->getConfiguration(), NULL );
  • 如上可以吗?
【解决方案2】:

流程组件可能是一个解决方案:

// .../someController

use Symfony\Component\Process\Process;

class someController extends Controller
{
   public function someAction()
   {
        $process = new Process('php app/console doctrine:migrations:migrate 20150914201128');
        $process->run();

       /.../
   }
}

【讨论】:

  • 这可能行得通……但是尽管您可以在控制器内部直接访问内核,但再次启动内核可能不是一个好的解决方案。
  • 那么在控制器内部执行迁移呢?
  • 实际上如何在控制器内部进行操作是问题所在。好的解决方案......不。 kernel.terminate event-listener 适合(简单)或发送到某种消息队列(高级)。
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2017-05-31
  • 2018-09-13
相关资源
最近更新 更多