如何将迁移路径传递给学说:迁移:迁移?

时间:2021-06-14 12:28:16

标签: doctrine-orm doctrine migration doctrine-migrations symfony-cli

可以定义多个路径,其中存储迁移:

doctrine_migrations.yaml

doctrine_migrations:
    migrations_paths:
        'App\Migrations': '%kernel.project_dir%/src/App'
        'AnotherApp\Migrations': '/path/to/other/migrations'
        'SomeBundle\Migrations': '@SomeBundle/Migrations'

现在我想分别使用这些路径,像这样:

$ php bin/console doctrine:migrations:migrate --em=foo --migrations_paths="AnotherApp\Migrations"

但是没有 migrations_paths 参数,我也没有找到其他任何东西,这听起来像是我需要的。

如何将单个路径或路径列表传递给 doctrine:migrations:migrate

1 个答案:

答案 0 :(得分:0)

我很确定您可能会这样做,在他们文档的 advanced section 中,提到了定义文件 cli-config.php 的方法。那么是什么阻止你定义这样一个包含如下内容的文件:

<?php
require 'vendor/autoload.php';

use Doctrine\DBAL\DriverManager;
use Doctrine\Migrations\Configuration\Connection\ExistingConnection;
use Doctrine\Migrations\DependencyFactory;
use Doctrine\Migrations\Configuration\Migration\YamlFile;

// $config = new PhpFile('migrations.php'); // Or use one of the Doctrine\Migrations\Configuration\Configuration\* loaders
$config = new YamlFile('database.yml');

$conn = DriverManager::getConnection(['driver' => 'pdo_sqlite', 'memory' => true]);

return DependencyFactory::fromConnection($config, new ExistingConnection($conn));

所以现在你有一个地方可以在进一步传递之前更改 $config,但是,为了使它看起来非常干净,我们可以使用装饰器模式来定义我们的配置版本,如下所示:< /p>

<?php
class CLIDecorator extends ConfigurationFile
{
  /**
   * @var YamlFile
   */
  private $config;

  private $args;

  public function __construct(YamlFile $file, $args)
  {
    $this->config = $file;
    $this->args = $args;
  }

  public function getConfiguration(): Configuration
  {
    $config = $this->config->getConfiguration();
    // I'm not sure if php has a nicer argv parser
    // but I'm leaving this up to the reader
    if ($this->getMigrationOpts()) {
      $config['migrations_paths'] = $this->parse($this->getMigrationOpts());
    }

    return $config;
  }

  final protected function parse($rawOpt)
  {
    $parts = explode("=", $rawOpt);
    return str_replace('"', '', $parts[1]);
  }

  final protected function getMigrationOpts()
  {
    foreach ($this->args as $arg) {
      if (str_starts_with($arg, '--migrations_paths')) {
        return $arg;
      }
    }

    return null;
  }
}

最终我们的代码将如下所示:

<?php
$config = new CLIDecorator(new YamlFile('database.yml'), $argv);

$conn = DriverManager::getConnection(['driver' => 'pdo_sqlite', 'memory' => true]);

return DependencyFactory::fromConnection($config, new ExistingConnection($conn));