imjoehaines/flowder

PHP 7.3+ 的简单且可扩展的 fixture 加载器,支持 SQLite 和 MySQL

v2.0.0 2020-02-09 11:11 UTC

This package is auto-updated.

Last update: 2024-08-29 04:47:23 UTC


README

Flowder 是一个(非常)简单的 PHP 7.3+ fixture 加载器,支持 SQLite 和 MySQL。

在 PHP 7.2 或以下版本中使用 Flowder?请尝试 版本 1

注意:如果您想在项目中使用 Flowder,您可能希望使用现有的框架集成

基本概念

Flowder 使用三个基本构建块构建;加载器截断器持久器

加载器负责将待加载的事物(例如文件或目录)转换为可持久化的数据数组。

截断器负责确保在持久化数据之前,所有将数据持久化的数据库表都是空的。

持久器负责将加载器提供的数据插入到数据库中。

这三个概念由以下接口表示

创建自己的加载器、截断器和持久器就像创建一个实现这些接口之一的类一样简单。

用法

使用 Flowder 加载 fixture 只需要几行代码 — 它只需要一个加载器、截断器和持久器。

例如,要将单个 PHP 文件加载到 SQLite 内存数据库中,可以使用以下文件

$db = new PDO('sqlite::memory:');

$flowder = new Imjoehaines\Flowder\Flowder(
    new Imjoehaines\Flowder\Loader\PhpFileLoader(),
    new Imjoehaines\Flowder\Truncator\SqliteTruncator($db),
    new Imjoehaines\Flowder\Persister\SqlitePersister($db)
);

$flowder->loadFixtures('test_data.php');

提供类

Flowder

Flowder 是您将主要使用的类。它负责协调加载、截断和持久化过程。

如上例所示,它使用三个参数构建 — 一个 LoaderInterface 实例、一个 TruncatorInterface 实例和一个 PersisterInterface 实例。

构造后,调用 loadFixtures 并传入要加载以持久化数据的事物。例如,使用 PhpFileLoader,您将路径传递给 loadFixtures 的 PHP 文件。

加载器

Flowder 随带三个加载器

PhpFileLoader

此加载器接受 PHP 文件名,使用 require 加载它,并使用返回的数据数组作为要持久化的数据。文件名本身用作表名(忽略文件扩展名)。

例如,给定以下 example_table.php 文件

return [
    [
        'column1' => 1,
        'column2' => 2,
    ],
    [
        'column1' => 4,
        'column2' => 5,
    ],
];

然后当使用 PhpFileLoader 加载时,它将返回以下 PHP 数组

[
    'example_table' => [
        [
            'column1' => 1,
            'column2' => 2,
        ],
        [
            'column1' => 4,
            'column2' => 5,
        ],
    ],
]

DirectoryLoader

DirectoryLoader 是围绕另一个加载器实例的包装器,它将为提供给 DirectoryLoader::load 的目录中的每个文件运行加载器的 load 方法。

例如,以下代码将使用 PhpFileLoader 加载 /some/directory 中的所有文件

$loader = new DirectoryLoader(
    new PhpFileLoader()
);

$data = $loader->load('/some/directory');

CachingLoader

CachingLoader 是另一种装饰器,它会缓存 load 方法的返回结果,以便在第一次调用 load 后,重复调用加载相同内容时将返回与第一次相同的结果。

在上面的示例基础上扩展,我们可以使用以下代码来加载 /some/directory 中的所有文件,但只在 for 循环的第一次迭代中访问磁盘。其他迭代将直接返回缓存的值

$loader = new CachingLoader(
    new DirectoryLoader(
        new PhpFileLoader()
    )
);

for ($i = 0; $i < 100; $i++) {
    $data = $loader->load('/some/directory');
}

通常,当您需要多次加载相同的资源时,使用 CachingLoader 是一个好主意,因为它可以显著加快固定加载速度。

其他加载器

对于加载除了 PHP 之外的其他文件格式,请查看 JSON 或 YAML 加载器

截断器

Flowder 随带两个截断器类

MySqlTruncator

此截断器接收一个表名,并在其上执行 MySQL 的 TRUNCATE TABLE 查询。它将在截断之前禁用外键检查,并在之后重新启用,以确保截断的顺序无关紧要。确保在所有固定运行后,您的数据库不会处于不一致状态是您的责任。

SqliteTruncator

此截断器接收一个表名,并在其上执行 DELETE FROM 查询。类似于 MySqlTruncator,它将在截断之前禁用外键检查,并在之后重新启用。

持久化器

MySqlPersister

MySqlPersister 接收一个表名和一组数据,并将其转换为单个 INSERT 查询。类似于 MySqlTruncator,它将在插入之前禁用外键检查,并在之后重新启用,以确保插入的顺序无关紧要。确保在所有固定运行后,您的数据库不会处于不一致状态是您的责任。

SqlitePersister

SqlitePersister 的功能与 MySqlPersister 相同,但它在事务中逐行插入数据而不是构建单个 INSERT 查询。这是为了克服 SQLite 的 SQLITE_MAX_VARIABLE_NUMBER 限制。