beta/data.provider
Composer 安装命令:
composer require beta/data.provider
包简介
Some data provider implementation
README 文档
README
Данная библиотека предоставляет единый инетрфейс для работы различными источниками данных: pdo, json, xml, csv...
В библиотеке реализованы 2 основные сущности:
- Провайдер (DataProviderInterface) - представляет из себя интерфейс для работы с инточником данных поддерживает: запрос, фильтрацию, сортировку, добавление, обновление и удаление данных.
- Мигратор (DataMigratorInterface) - позволяет обмениваться данными между различными источниками данных.
На текущий момент реализованы след. провайдеры данных:
- PdoDataProvider - позволяет работать с СУБД через интерфейс PDO, для работы неоходимо пробросить конструктор SQL запросов, на текущий момент реализован конструктор с поддержкой MySql диалекта.
- JsonDataProvider - прозволяет пработать с данными json файлов.
- XmlDataProvider - позволяет работать с данными xml файлов.
- CsvDataProvider - позволяет работать с данными csv файлов.
- ClosureDataProvider - произодный провайдер, предназначен для запроса произвольных данных, но без поддержки операций сохранения, обновления и удаления, в качестве аргумента принимает анонимную функцию которая должна возвращать ассоциативный массив с данными. Подходит для генерации тестовых данных например через библиотеку fzaninotto/faker.
Пример работы с провайдером данных:
use PDO; use Data\Provider\Providers\PdoDataProvider; use Data\Provider\Providers\JsonDataProvider; use Data\Provider\Providers\XmlDataProvider; use Data\Provider\Providers\CsvDataProvider; use Data\Provider\Providers\ClosureDataProvider; use Data\Provider\SqlBuilderMySql; use Data\Provider\QueryCriteria; use Data\Provider\Interfaces\QueryCriteriaInterface; use Data\Provider\Interfaces\CompareRuleInterface; use Data\Provider\Interfaces\TransactionOperationResultInterface; use Faker\Factory; $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=UTF8', 'username', 'password'); $pdoProvider = new PdoDataProvider( $pdo, // указываем объект для подключения через интерфейс PDO 'users', // указываем таблицу с которой будем работать new SqlBuilderMysql(), // указываем конструктор SQL запросов 'id' // указываем первичный плюч ); $jsonProvider = new JsonDataProvider( $_SERVER['DOCUMENT_ROOT'].'/users.json', // указываем путь к json файлу 'id' // указываем первичный ключ ); $xmlProvider = new XmlDataProvider( $_SERVER['DOCUMENT_ROOT'].'/users.xml', // указываем путь к xml файлу 'list', // имя xml узла от которого будут читаться данные 'item', // имя xml узла элемента 'id', // указываем первичный ключ 'otheritem' // имя xml узла для перечисляемых данных (массивы) ); $csvProvider = new CsvDataProvider( $_SERVER['DOCUMENT_ROOT'].'/users.csv', // указываем путь к csv файлу 'id', // указываем первичный ключ ';', '"', '\\' ); $faker = Factory::create('ru_RU'); $fakerProvider = new ClosureDataProvider( 10, // указываем ограничение по количеству генерируемых данных по-умолчанию (можно изменить через объект QueryCriteriaInterface указав свой лимит) function (QueryCriteriaInterface $query) use ($fakerFactory) { return [ 'id' => $fakerFactory->randomNumber(), 'name' => $fakerFactory->firstName, 'email' => $fakerFactory->safeEmail ]; } ); $query = new QueryCriteria(); $query->addCriteria('id', CompareRuleInterface::IN, [1,3,5]); $query->setLimit(3); $query->setOrderBy('id', false); $pdoData = $pdoProvider->getData($query); // данные из таблицы users соотвествующие критериям выборки $jsonData = $jsonProvider->getData($query); // данные из файла users.json соотвествующие критериям выборки $xmlData = $xmlProvider->getData($query); // данные из файла users.xml соотвествующие критериям выборки $csvData = $csvProvider->getData($query); // данные из файла users.csv соотвествующие критериям выборки $fakerData = $fakerProvider->getData($query); // сгенерированные данные (в этом примере через бибилотеку fzaninotto/faker) $jsonProvider->startTransaction(); // запускаем транзакцию $dataForSave = [ 'name' => 'test', 'email' => 'user@example.com' ]; $resultAdd = $pdoProvider->save($dataForSave); // пример добавления данных $updateQueryCriteria = new QueryCriteria(); $updateQueryCriteria->addCriteria('id', CompareRuleInterface::MORE, 10); // будем обновлять только записи со значением столбца id > 10 $updateQueryCriteria->setLimit(10); // обновим не более 10 записей соотвествующих условию выше $dataForSave = [ 'name' => 'hidden', ]; $updateResult = $jsonProvider->save($dataForSave, $query); // пример обновления данных $deleteQuery = new QueryCriteria(); $deleteQuery->addCriteria('name', CompareRuleInterface::LIKE, 'test'); // будем удалять всех пользователей в имени которых есть слово test $deleteQuery->setLimit(100); // удалим не более 100 пользователей $csvProvider->remove($query); // пример удаления данных $jsonProvider->commitTransaction(); // фиксируем транзакцию if ($updateResult instanceof TransactionOperationResultInterface) { // выполнялась ли операция в транзакции if ($updateResult->isFinished()) { // проверяем стутс транзакции $updateResult->hasError(); // проверяем наличие ошибки $updateResult->getData(); // данные операции } }
Пример обмена данными между различными источниками
use PDO; use Data\Provider\Providers\PdoDataProvider; use Data\Provider\Providers\ClosureDataProvider; use Data\Provider\DefaultDataMigrator; use Data\Provider\QueryCriteria; use Data\Provider\Interfaces\CompareRuleInterface; $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=UTF8', 'username', 'password'); $pdoProvider = new PdoDataProvider( $pdo, // указываем объект для подключения через интерфейс PDO 'users', // указываем таблицу с которой будем работать new SqlBuilderMysql(), // указываем конструктор SQL запросов 'id' // указываем первичный плюч ); $faker = Factory::create('ru_RU'); $fakerProvider = new ClosureDataProvider( 10, // указываем ограничение по количеству генерируемых данных по-умолчанию (можно изменить через объект QueryCriteriaInterface указав свой лимит) function (QueryCriteriaInterface $query) use ($fakerFactory) { return [ 'id' => $fakerFactory->randomNumber(), 'name' => $fakerFactory->firstName, 'email' => $fakerFactory->safeEmail ]; } ); $migrator = new DefaultDataMigrator( $fakerProvider, // источник данных $pdoProvider // приемник данных ); $query = new QueryCriteria(); $query->setLimit(20); // увеличиваем количество генерируемых данных с 10 до 20 $migrateInsertResult = $migrator->runInsert($query); // добавление сгенерированных данных в таблицу users $migrateInsertResult->getErrors(); // есть ли ошибки в процессе добавления данных в таблицу $migrateInsertResult->getErrors(); // список ошибок $migrateInsertResult->getSourceData(); // сгененрированные для записи данные $migrateInsertResult->getUnimportedDataList(); // список данных которые не удалось добавить в таблицу $migrator->runUpdate($query, function ($dataForMigrate) { // обновление данных в таблице соотвествующие критериям укзанным во втором аргументе сгенерированными данными $query = new QueryCriteria(); $query->addCriteria('id', CompareRuleInterface::EQUAL, $dataForMigrate['id']); return $query; }, true); // указываем что данные не найденые по критериям будут добавлены в таблицу как новые записи $migrator->runUpdate($query, 'id'); // обновление данных в таблице аналогично примеру выше, в данном случае во втором аргументе передается имя ключа источника, данные которого будут сравниваться с первичным ключом приемника
beta/data.provider 适用场景与选型建议
beta/data.provider 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.32k 次下载、GitHub Stars 达 3, 最近一次更新时间为 2022 年 02 月 17 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 beta/data.provider 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 beta/data.provider 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 1.32k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 6
- 依赖项目数: 5
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2022-02-17