【问题标题】:How to pass migrations_paths to doctrine:migrations:migrate?如何将迁移路径传递给教义:迁移:迁移?
【发布时间】:2021-08-30 08:36:36
【问题描述】:

可以定义多个存储迁移的路径:

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

【问题讨论】:

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


    【解决方案1】:

    我很确定您可能会这样做,在他们的文档中的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,但是,为了使它看起来非常干净,我们可以使用装饰器模式来定义我们的配置版本,如下所示:

    <?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));
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 2015-11-10
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      相关资源
      最近更新 更多