pipetic / bundle
Pipetic Bundle
1.0.0
2026-03-14 22:04 UTC
Requires
- php: >=8.2
- ext-json: *
- bytic/actions: dev-main||^1.0
- bytic/controllers: ^1.0|^2.0
- bytic/controllers-extra: ^1.0|^2.0
- bytic/event-discovery: ^0.9 || ^1.0||^2.0
- bytic/event-dispatcher: ^1.0|^2.0
- bytic/migrations: ~0.13
- bytic/models-smart-properties: ^0.9|^1.0|^2.0
- bytic/money: ^1.0||^2.0
- bytic/orm: ^1.0|^2.0
- bytic/orm-behaviors: ^0.9|^1.0|^2.0
- bytic/orm-filters: ^0.9|^1.0|^2.0
- bytic/package-base: ^1.0|^2.0
- bytic/translation: ^1.0|^2.0
- bytic/utility: ^1.0.73||^2.0
Requires (Dev)
- bytic/admin-base: ^1.0|^2.0
- bytic/form: ^1.0|^2.0
- bytic/phpqatools: ^1.0
- bytic/view: ^1.0|^2.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Base package for the Pipetic organisation.
Provides the core ETL pipeline primitives and Droplet tracking model used by Pipetic adapter packages (e.g. pipetic/salesforce).
Features
- ETL Pipeline – minimal but extensible Extract → Transform → Load orchestrator inspired by wizacode/php-etl, jwhulette/pipes, and php-etl/pipeline.
- Droplet tracking – lightweight model for tracking the lifecycle of each sync item (Pending → Sent / Retrying / Failed).
Requirements
- PHP >= 8.2
Installation
composer require pipetic/bundle
ETL Pipeline
Basic usage
use Pipetic\Bundle\Pipeline\Pipeline; (new Pipeline()) ->extract(new MySourceExtractor()) ->pipe(new MapFieldsTransformer($fieldMap)) ->pipe(new ValidateRecordTransformer()) ->load(new MyDestinationLoader()) ->run();
Custom Extractor
use Pipetic\Bundle\Pipeline\AbstractExtractor; class MySourceExtractor extends AbstractExtractor { protected function doExtract(): iterable { foreach ($this->source->getRecords() as $record) { yield $record; } } }
Custom Transformer
Return null from doTransform() to skip (filter out) a record.
use Pipetic\Bundle\Pipeline\AbstractTransformer; class MapFieldsTransformer extends AbstractTransformer { protected function doTransform(mixed $record): mixed { return [ 'name' => $record['full_name'], 'email' => $record['email_address'], ]; } }
Custom Loader
use Pipetic\Bundle\Pipeline\AbstractLoader; class MyDestinationLoader extends AbstractLoader { protected function doLoad(mixed $record): void { $this->repository->save($record); } }
Processed / skipped counts
$pipeline->run(); echo $pipeline->getProcessedCount(); // records successfully loaded echo $pipeline->getSkippedCount(); // records filtered out by a transformer