Phinx миграция памяти sqlite phpunit

Миграция Phinx с использованием памяти sqlite, похоже, не работает в 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");

Эта последняя строка запрашивает таблицу продуктов, которая создает следующее исключение:

PDOException: SQLSTATE [HY000]: общая ошибка: 1 нет такой таблицы: продукт в /home/vagrant/code/ecommerce/public/index.php в строке 43

Для полноты здесь миграция продукта, которая отлично работает со средой разработки 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();
    }
}

person Garthfield Carter    schedule 04.06.2018    source источник
comment
Я копался в коде и обнаружил, что конструктор Config имеет параметр $configFilePath. Без этого пути к миграциям и семенам не могут быть построены правильно. Как только я задал путь, я могу программно создать базу данных памяти sqlite.   -  person Garthfield Carter    schedule 05.06.2018


Ответы (1)


Когда вы обычно используете phinx из командной строки, свойство configFilePath Phinx\Config правильно установлено на полный путь к phinx.yml

Однако в примере в документации phinx (http://docs.phinx.org/en/latest/commands.html#using-phinx-with-phpunit) для создания базы данных sqlite в памяти для тестирования phpunit используется массив php, потому что экземпляр pdo должен загружаться вручную в.

Поскольку путь к phinx.yml не задан, метод replaceTokens Phinx\Config создает PHINX_CONFIG_DIR, вызывая это:

$tokens['%%PHINX_CONFIG_DIR%%'] = dirname($this->getConfigFilePath());

Phinx использует %%PHINX_CONFIG_DIR%%, чтобы выяснить, где находятся его папки с миграциями и семенами, когда не используется phinx.yml, это больше не работает.

Решение состоит в том, чтобы указать путь при создании класса Config вручную:

$config = new Config($settings, './');
person Garthfield Carter    schedule 05.06.2018