Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Exporter Laravel Package

sonata-project/exporter

SonataExporter is a lightweight PHP library for exporting data to multiple formats (CSV, XLS, JSON, XML). It provides writers, handlers, and iterators to stream large datasets efficiently and integrate easily into Symfony apps and services.

View on GitHub
Deep Wiki
Context7
## Getting Started

### **Minimal Setup**
1. **Installation**
   ```bash
   composer require sonata-project/exporter
  • Note: This release drops PHP 8.1 support and requires PHP 8.2+.
  • For Symfony users, this release adds Symfony 8 support while dropping Symfony 7.1/7.2.
  1. First Use Case: Exporting Data to CSV

    use Sonata\Exporter\CsvFile\CsvExporter;
    use Sonata\Exporter\CsvFile\CsvFileBuilder;
    
    $exporter = new CsvExporter();
    $exporter->setData($yourArrayData); // Array of associative arrays
    $exporter->generate(new CsvFileBuilder());
    
    // Output to browser
    $exporter->sendHttpResponse('export.csv');
    
  2. Where to Look First

    • Core Classes: Focus on CsvExporter, ExcelExporter, and CsvFileBuilder for CSV/Excel exports.
    • Doctrine Integration: Updated DoctrineDBALConnectionSourceIterator now works with doctrine/dbal 4.x.
    • Documentation: Review the SonataProject documentation for updated compatibility notes.

Implementation Patterns

Common Workflows

  1. Dynamic Export from Controller

    public function export(Request $request, CsvExporter $exporter)
    {
        $data = YourModel::query()->get()->toArray();
        $exporter->setData($data);
    
        $builder = new CsvFileBuilder();
        $builder->setDelimiter(';'); // Custom delimiter
        $exporter->generate($builder);
    
        return $exporter->sendHttpResponse('custom_export.csv');
    }
    
    • Dependency Injection: Use Laravel’s container to auto-resolve CsvExporter/ExcelExporter.
  2. Reusable Export Services

    class UserExporterService
    {
        public function __construct(private CsvExporter $exporter) {}
    
        public function exportActiveUsers(): string
        {
            $this->exporter->setData(User::active()->get()->toArray());
            $builder = new CsvFileBuilder();
            $builder->setFields(['id', 'name', 'email']);
            $this->exporter->generate($builder);
            return $this->exporter->generateOutput();
        }
    }
    
  3. Doctrine Query Export (Updated for DBAL 4)

    use Sonata\Exporter\Doctrine\DoctrineDBALConnectionSourceIterator;
    
    $connection = \DBAL::getConnection(); // Laravel DBAL connection
    $iterator = new DoctrineDBALConnectionSourceIterator(
        $connection,
        'SELECT * FROM users WHERE active = 1'
    );
    
    $exporter = new CsvExporter();
    $exporter->setData($iterator);
    $exporter->generate(new CsvFileBuilder());
    
  4. Excel Exports

    $exporter = new \Sonata\Exporter\ExcelFile\ExcelExporter();
    $exporter->setData($yourData);
    $exporter->generate(new \Sonata\Exporter\ExcelFile\ExcelFileBuilder());
    return $exporter->sendHttpResponse('report.xlsx');
    

Advanced Patterns

  • Custom Field Mappers
    $builder->addFieldDescription('created_at', new \Sonata\Exporter\FieldDescription(
        'created_at',
        'Date',
        fn ($value) => (new \Carbon\Carbon($value))->format('Y-m-d')
    ));
    
  • Batch Processing with DBAL 4
    $exporter->setData(
        $connection->executeQuery('SELECT * FROM large_table')->iterateAssociative()
    );
    

Gotchas and Tips

Common Pitfalls

  1. PHP/Doctrine Version Mismatch

    • Error: Class 'Doctrine\DBAL\Connection' not found or Method "iterateAssociative" does not exist.
    • Fix: Update doctrine/dbal to ^4.0 and ensure PHP 8.2+:
      composer require doctrine/dbal:^4.0
      
  2. Symfony Version Conflicts

    • Error: If using Symfony, ensure your symfony/* packages are 8.0+.
    • Fix: Run composer require symfony/*:^8.0 and update config/packages/.
  3. Memory Limits with DBAL Iterators

    • Large DBAL iterators may still cause memory issues.
    • Fix: Use chunking with iterateAssociative() and process in batches.
  4. Field Naming Collisions

    • Keys like class or private may break exports.
    • Fix: Explicitly whitelist fields:
      $builder->setFields(['id', 'name']); // Only export these
      

Debugging Tips

  • Inspect DBAL Iterators

    $iterator = new DoctrineDBALConnectionSourceIterator($connection, 'SELECT * FROM users');
    foreach ($iterator as $row) {
        dump($row); // Verify data structure
    }
    
  • Check Symfony Kernel For Symfony users, ensure your Kernel extends Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait (Symfony 8+).

  • Log Export Errors

    try {
        $exporter->generate($builder);
    } catch (\Throwable $e) {
        \Log::error('Export failed: ' . $e->getMessage(), ['trace' => $e->getTraceAsString()]);
    }
    

Extension Points

  1. Custom Exporters for New Formats Extend AbstractExporter (e.g., JSON, XML):

    class JsonExporter extends AbstractExporter
    {
        protected function generateFileContent(): string
        {
            return json_encode($this->data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        }
    }
    
  2. Doctrine Event Subscribers Hook into DBAL events for pre-processing:

    $connection->getEventManager()->addListener(
        \Doctrine\DBAL\Connection::EVENT_QUERY,
        fn ($event) => dump($event->getSql()) // Log queries
    );
    
  3. Laravel Service Providers Register exporters as singletons:

    public function register()
    {
        $this->app->singleton(CsvExporter::class, fn () => new CsvExporter());
    }
    

Configuration Quirks

  • DBAL 4 Changes
    • iterateAssociative() replaces older iterator methods.
    • Fix: Update your code to use the new method:
      $iterator = $connection->executeQuery('SELECT * FROM users')->iterateAssociative();
      
  • Symfony Autowiring Ensure your exporters are autowired in Symfony 8:
    # config/services.yaml
    Sonata\Exporter\CsvFile\CsvExporter: ~
    
  • No Config File This package remains config-free; all settings are code-based.

Upgrade Notes

  • PHP 8.1 Users: Migrate to 8.2+ to avoid compatibility issues.
  • Symfony 7.x Users: Upgrade to Symfony 8 for full feature support.
  • Doctrine DBAL: Update to 4.x for DoctrineDBALConnectionSourceIterator compatibility.

NO_UPDATE_NEEDED would **not** apply here due to breaking changes (PHP/Symfony/Doctrine version drops) and new compatibility features.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
terminal42/code-quality-tools
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky