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

Autobus Bus Export Bundle Laravel Package

autobus-php/autobus-bus-export-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require autobus-php/autobus-bus-export-bundle
    

    Add to config/bundles.php (Symfony 4.4+):

    return [
        // ...
        Autobus\BusExportBundle\AutobusBusExportBundle::class => ['all' => true],
    ];
    
  2. First Use Case: Exporting a Command Result Define a command that returns a CommandResult (e.g., from autobus-php/autobus):

    use Autobus\BusExportBundle\Command\ExportCommand;
    use Autobus\BusExportBundle\Command\ExportCommandResult;
    
    class MyExportCommand extends ExportCommand
    {
        protected function execute(): ExportCommandResult
        {
            return new ExportCommandResult(
                'my_export.csv',
                ['header1', 'header2'],
                [['data1', 'data2'], ['data3', 'data4']]
            );
        }
    }
    

    Register the command in config/services.yaml:

    services:
        App\Command\MyExportCommand:
            tags: ['console.command']
    
  3. Trigger Export Run via CLI:

    php bin/console app:my-export
    

    Outputs to var/exports/my_export.csv (default path).


Implementation Patterns

Workflows

  1. Command-Based Exports Extend ExportCommand for CSV/JSON exports:

    class UserExportCommand extends ExportCommand
    {
        public function __construct(private UserRepository $users)
        {
        }
    
        protected function execute(): ExportCommandResult
        {
            $users = $this->users->findAll();
            $headers = ['id', 'name', 'email'];
            $rows = array_map(fn ($user) => [$user->id, $user->name, $user->email], $users);
    
            return new ExportCommandResult(
                'users_' . now()->format('Y-m-d') . '.csv',
                $headers,
                $rows
            );
        }
    }
    
  2. Dynamic File Naming Use now() or request data for unique filenames:

    return new ExportCommandResult(
        'report_' . $request->get('filter') . '_' . now()->timestamp . '.json',
        ['key', 'value'],
        $data
    );
    
  3. Integration with Symfony Events Dispatch events before/after export (e.g., logging, notifications):

    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Autobus\BusExportBundle\Event\ExportEvent;
    
    class ExportLogger implements EventSubscriberInterface
    {
        public static function getSubscribedEvents(): array
        {
            return [
                ExportEvent::PRE_EXPORT => 'onPreExport',
                ExportEvent::POST_EXPORT => 'onPostExport',
            ];
        }
    
        public function onPreExport(ExportEvent $event): void
        {
            // Log start or validate data
        }
    
        public function onPostExport(ExportEvent $event): void
        {
            // Send email with export link
        }
    }
    
  4. Custom Export Formats Override ExportCommandResult to support new formats (e.g., Excel):

    class ExcelExportCommandResult extends ExportCommandResult
    {
        public function __construct(string $filename, array $data)
        {
            parent::__construct($filename, [], $data);
        }
    
        public function getFormat(): string
        {
            return 'xlsx';
        }
    }
    

Gotchas and Tips

Pitfalls

  1. File Path Configuration

    • Default export path: var/exports/. Override in config/packages/autobus_bus_export.yaml:
      autobus_bus_export:
          export_dir: '%kernel.project_dir%/public/exports'
      
    • Gotcha: Ensure the directory is writable (chmod -R 775 var/exports).
  2. Memory Limits

    • Large datasets may hit PHP memory limits. Use chunking:
      $chunkSize = 1000;
      foreach (array_chunk($bigArray, $chunkSize) as $chunk) {
          $this->exportService->exportChunk($chunk, $filename);
      }
      
  3. CSV Encoding Issues

    • Non-ASCII characters (e.g., é, ü) may corrupt CSV. Use UTF-8 BOM or encode manually:
      $csv = fopen('php://output', 'w');
      fputcsv($csv, $headers, ',', '"');
      foreach ($rows as $row) {
          fputcsv($csv, array_map('utf8_encode', $row), ',', '"');
      }
      
  4. Command Naming Conflicts

    • Prefix commands to avoid clashes (e.g., app:export-users vs. app:export-orders).

Debugging

  1. Verify Export Path Check ExportCommand::getExportPath() for correct directory. Log the path if issues arise:

    $this->logger->info('Export path:', ['path' => $this->getExportPath()]);
    
  2. Validate Data Structure Ensure $headers and $rows are consistent in length. Use:

    assert(count($headers) === count($rows[0]), 'Headers/rows mismatch');
    
  3. Symfony Cache Clearing After modifying bundle config, clear cache:

    php bin/console cache:clear
    

Extension Points

  1. Custom Writers Implement Autobus\BusExportBundle\Writer\WriterInterface for new formats (e.g., PDF):

    class PdfWriter implements WriterInterface
    {
        public function write(string $filename, array $data): void
        {
            // Use Dompdf or similar
        }
    }
    

    Register in services:

    services:
        App\Writer\PdfWriter:
            tags: ['autobus_bus_export.writer']
    
  2. Pre/Post-Export Hooks Subscribe to ExportEvent::PRE_EXPORT/POST_EXPORT for validation/notification logic (see Workflows above).

  3. Dependency Injection Inject services (e.g., UserRepository) into commands for dynamic data:

    class ExportCommand extends ExportCommand
    {
        public function __construct(private ExportService $exportService)
        {
        }
    }
    
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.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui