PHP code example of gerardo-cornejo / batch

1. Go to this page and download the library: Download gerardo-cornejo/batch library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

gerardo-cornejo / batch example snippets



namespace App\Batch;

class Reader
{
    public static function execute($params): array
    {
        // Implementa la lógica de lectura
        return $data;
    }
}


namespace App\Batch;

class Processor
{
    public static function execute(array &$data)
    {
        // Implementa la lógica de procesamiento
        // Los datos se pasan por referencia para modificación
    }
}


namespace App\Batch;

class Writer
{
    public static function execute(array &$data)
    {
        // Implementa la lógica de escritura
    }
}


namespace App\Batch;

use CodeIgniter\CLI\CLI;

class Reader
{
    public static function execute($params): array
    {
        CLI::write('Iniciando lectura de datos...');
        
        // Ejemplo: leer desde archivo CSV
        $file = $params['file'] ?? '';
        $data = [];
        
        if (file_exists($file)) {
            $handle = fopen($file, 'r');
            while (($row = fgetcsv($handle)) !== false) {
                $data[] = $row;
            }
            fclose($handle);
        }
        
        CLI::write(sprintf('Leídos %d registros', count($data)));
        return $data;
    }
}


namespace App\Batch;

use CodeIgniter\CLI\CLI;
use Config\Services;

class Processor
{
    public static function execute(array &$data)
    {
        CLI::write('Procesando datos...');
        
        $db = Services::database();
        
        foreach ($data as &$row) {
            // Ejemplo: validar y transformar datos
            $row['processed_at'] = date('Y-m-d H:i:s');
            $row['status'] = 'processed';
            
            // Realizar validaciones
            if (empty($row['email'])) {
                $row['status'] = 'error';
                $row['error'] = 'Email requerido';
            }
        }
        
        CLI::write('Procesamiento completado');
    }
}


namespace App\Batch;

use CodeIgniter\CLI\CLI;
use Config\Services;

class Writer
{
    public static function execute(array &$data)
    {
        CLI::write('Guardando datos...');
        
        $db = Services::database();
        $builder = $db->table('batch_results');
        
        $successful = 0;
        $errors = 0;
        
        foreach ($data as $row) {
            if ($row['status'] === 'processed') {
                $builder->insert($row);
                $successful++;
            } else {
                CLI::error('Error en registro: ' . ($row['error'] ?? 'Error desconocido'));
                $errors++;
            }
        }
        
        CLI::write(sprintf('Guardados: %d, Errores: %d', $successful, $errors));
    }
}


namespace App\Commands;

use App\Batch\Processor;
use App\Batch\Reader;
use App\Batch\Writer;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;

class Execute extends BaseCommand
{
    protected $group = 'Batch';
    protected $name = 'batch:execute';
    protected $description = 'Ejecuta un proceso batch completo';
    protected $usage = 'batch:execute [options]';
    
    protected $arguments = [
        'file' => 'Archivo de entrada para procesar'
    ];
    
    protected $options = [
        '--dry-run' => 'Ejecutar sin guardar cambios'
    ];

    public function run(array $params)
    {
        CLI::write('=== Iniciando Proceso Batch ===', 'green');
        
        try {
            // Leer datos
            $data = Reader::execute($params);
            
            if (empty($data)) {
                CLI::error('No se encontraron datos para procesar');
                return;
            }
            
            // Procesar datos
            Processor::execute($data);
            
            // Escribir datos (solo si no es dry-run)
            if (!CLI::getOption('dry-run')) {
                Writer::execute($data);
            } else {
                CLI::write('Modo dry-run: No se guardaron cambios', 'yellow');
            }
            
            CLI::write('=== Proceso Completado ===', 'green');
            
        } catch (\Exception $e) {
            CLI::error('Error en el proceso batch: ' . $e->getMessage());
        }
    }
}



use Innite\Batch\Libraries\Optional;

// Crear un Optional con valor
$optional = Optional::of('valor');

// Crear un Optional que acepta null
$optional = Optional::ofNullable($posibleNull);

// Verificar si tiene valor
if ($optional->isPresent()) {
    $valor = $optional->get();
}

// Usar valor por defecto si está vacío
$valor = $optional->orElse('valor por defecto');

// Transformar el valor si existe
$resultado = $optional
    ->map(fn($v) => strtoupper($v))
    ->orElse('SIN VALOR');

// Filtrar valores
$mayores = Optional::ofNullable($edad)
    ->filter(fn($e) => $e >= 18)
    ->orElse(0);

// En Processor.php
use Config\Services;

$logger = Services::logger();
$logger->info('Procesando lote', ['count' => count($data)]);

// En cualquier clase
try {
    // Lógica del proceso
} catch (\Exception $e) {
    CLI::error('Error: ' . $e->getMessage());
    // Log del error
    log_message('error', 'Batch process failed: ' . $e->getMessage());
}

app/
├── Batch/
│   ├── Reader.php
│   ├── Processor.php
│   └── Writer.php
└── Commands/
    └── Execute.php
bash
# Ejecutar desde la línea de comandos
php spark command:run [parámetros]