Миграция финкса sqlite memory phpunit - PullRequest
0 голосов
/ 04 июня 2018

Миграция финкса с использованием 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();
    }
}

1 Ответ

0 голосов
/ 05 июня 2018

При обычном использовании 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, './');
...