承接 beta/data.provider 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

beta/data.provider

最新稳定版本:1.4.6

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');                         // обновление данных в таблице аналогично примеру выше, в данном случае во втором аргументе передается имя ключа источника, данные которого будут сравниваться с первичным ключом приемника

统计信息

  • 总下载量: 1.21k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 3
  • 点击次数: 3
  • 依赖项目数: 5
  • 推荐数: 0

GitHub 信息

  • Stars: 3
  • Watchers: 2
  • Forks: 4
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-02-17

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固