derafu/data-processor
Laravel/PHP data processing toolkit for defining, transforming, validating, and exporting datasets through a consistent pipeline. Provides reusable processors and helpers to normalize inputs, run rules, and produce clean output for apps, imports, and integrations.
Installation
composer require derafu/data-processor
Add the service provider to config/app.php:
'providers' => [
// ...
Derafu\DataProcessor\DataProcessorServiceProvider::class,
],
Basic Usage
Define a processor class (e.g., app/Processors/UserProcessor.php):
namespace App\Processors;
use Derafu\DataProcessor\Contracts\Processor;
class UserProcessor implements Processor
{
public function process(array $data): array
{
return [
'name' => strtoupper($data['name'] ?? ''),
'email' => strtolower($data['email'] ?? ''),
];
}
}
First Use Case Register and run a processor via a facade:
use Derafu\DataProcessor\Facades\DataProcessor;
$processor = DataProcessor::register('user', UserProcessor::class);
$result = $processor->process(['name' => 'John', 'email' => 'JOHN@EXAMPLE.COM']);
// Output: ['name' => 'JOHN', 'email' => 'john@example.com']
Key Files to Explore
config/data-processor.php (default config)src/Contracts/Processor.php (interface definition)src/Exceptions/ (custom exceptions)Processor Registration
app/Processors and configure discover_processors in config/data-processor.php to true.Four-Phase Processing
Implement these methods in your Processor class for full control:
public function prepare(array $data): array { /* Pre-processing */ }
public function validate(array $data): void { /* Validation */ }
public function transform(array $data): array { /* Core logic */ }
public function finalize(array $data): array { /* Post-processing */ }
Chaining Processors
$result = DataProcessor::chain('user', 'sanitize')
->process($rawData);
Dependency Injection Bind dependencies in the processor constructor:
public function __construct(private Logger $logger) {}
event(new DataProcessed($result, $this));
DataProcessor::dispatch('user', $data)->onQueue('processors');
public function handle($request, Closure $next)
{
$request->merge(DataProcessor::process('api_input', $request->all()));
return $next($request);
}
Phase Order
prepare → validate → transform → finalize.validate may lead to unhandled invalid data.Circular Dependencies
A calls B, which calls A).Data Mutability
process() method receives a copy of the input array. Modify it carefully to avoid unintended side effects.Error Handling
ValidationException in validate() to provide meaningful feedback:
public function validate(array $data): void
{
if (empty($data['email'])) {
throw new ValidationException('Email is required.');
}
}
Enable Logging
Set 'debug' => true in config/data-processor.php to log phase execution.
Dump Data
Use DataProcessor::debug()->process($data) to inspect intermediate states.
Check Cache
Processors are cached by default. Clear the cache (php artisan cache:clear) if changes aren’t reflected.
Custom Phases
Extend the base Processor class to add middleware-like phases:
public function beforeTransform(array $data): array { /* Custom logic */ }
Processor Decorators Wrap processors to add cross-cutting concerns (e.g., logging, caching):
DataProcessor::decorate('user', function ($processor) {
return new class($processor) implements Processor {
public function process(array $data): array {
Log::info('Processing started', ['data' => $data]);
return $this->processor->process($data);
}
};
});
Dynamic Processor Resolution Use closures for runtime processor resolution:
DataProcessor::register('dynamic', function ($data) {
return new class($data) implements Processor { /* ... */ };
});
Default Processor
Set 'default_processor' in config to avoid ProcessorNotFoundException.
Phase Skipping Disable phases via config:
'phases' => [
'prepare' => true,
'validate' => false, // Skip validation
],
How can I help you explore Laravel packages today?