imjoehaines / flowder
PHP 7.3+ 的简单且可扩展的 fixture 加载器,支持 SQLite 和 MySQL
Requires
- php: ^7.3
Requires (Dev)
- jangregor/phpstan-prophecy: ^0.6.1
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^0.12.9
- phpstan/phpstan-phpunit: ^0.12.6
- phpunit/phpunit: 9.0.0
- symplify/easy-coding-standard: ^7.2
Suggests
- imjoehaines/flowdception: Support for Flowder in Codeception test suites
- imjoehaines/flowder-phpunit: Support for Flowder in PHPUnit test suites
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 PHPUnit — 用于 PHPUnit 的 Flowder 测试监听器
- Flowdception — Codception 的 Flowder 扩展
基本概念
Flowder 使用三个基本构建块构建;加载器、截断器 和 持久器。
加载器负责将待加载的事物(例如文件或目录)转换为可持久化的数据数组。
截断器负责确保在持久化数据之前,所有将数据持久化的数据库表都是空的。
持久器负责将加载器提供的数据插入到数据库中。
这三个概念由以下接口表示
Imjoehaines\Flowder\Loader\LoaderInterface
Imjoehaines\Flowder\Truncator\TruncatorInterface
Imjoehaines\Flowder\Persister\PersisterInterface
创建自己的加载器、截断器和持久器就像创建一个实现这些接口之一的类一样简单。
用法
使用 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
限制。