Phinx迁移sqlite内存phpunit

Phinx迁移sqlite内存phpunit,php,mysql,phpunit,database-migration,phinx,Php,Mysql,Phpunit,Database Migration,Phinx,使用sqlite内存的Phinx迁移在0.9.2中似乎不起作用,我有一个非常简单的应用程序,只有一个表(产品)。运行迁移后,产品表不存在: use Symfony\Component\Yaml\Yaml; use Phinx\Config\Config; use Phinx\Migration\Manager; use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Output\NullOut

使用sqlite内存的Phinx迁移在0.9.2中似乎不起作用,我有一个非常简单的应用程序,只有一个表(产品)。运行迁移后,产品表不存在:

use Symfony\Component\Yaml\Yaml;
use Phinx\Config\Config;
use Phinx\Migration\Manager;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\NullOutput;

$pdo = new PDO('sqlite::memory:', null, null, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

$settings = Yaml::parseFile('../phinx.yml');
$settings['environments']['testing'] = [
    'adapter'       => 'sqlite',
    'connection'    => $pdo
];
$config = new Config($settings);

$manager = new Manager($config, new StringInput(' '), new NullOutput());
$manager->migrate('testing');
$manager->seed('testing');

$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

// This line creates an exception of table doesn't exist
$pdo->query("SELECT * FROM product");
最后一行查询生成以下异常的product表:

PDOException:SQLSTATE[HY000]:一般错误:1第43行的/home/vagrant/code/ecommerce/public/index.php中没有这样的表:product

为了完整起见,以下是产品迁移,它与mysql开发环境完美配合:

use Phinx\Migration\AbstractMigration;

class Product extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('product');
        $table->addColumn('name', 'string', ['limit' => 100, 'null' => false])
            ->addColumn('price', 'integer')
            ->create();
    }
}

通常从命令行使用phinx时,phinx\Config的configFilePath属性被正确设置为phinx.yml的完整路径

然而,在phinx文档()中创建用于phpunit测试的sqlite内存数据库的示例中,它使用php数组,因为必须手动输入pdo实例

由于未设置phinx.yml的路径,因此phinx\Config的replaceTokens方法通过调用以下命令创建phinx\u Config\u目录:

$tokens['%%PHINX_CONFIG_DIR%%'] = dirname($this->getConfigFilePath());
Phinx使用%%Phinx_CONFIG_DIR%%确定其迁移和种子文件夹的位置,如果不使用Phinx.yml,则此功能将不再有效

解决方案是在手动创建配置类时提供路径:

$config = new Config($settings, './');

我仔细研究了代码,发现配置构造函数有一个$configFilePath参数。如果不传递这些信息,迁移和种子的路径就无法正确构建。一旦输入路径,我就能够通过编程方式创建sqlite内存数据库。