Laravel заголовки экспорта Excel () генерируют исключение только в очереди - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь экспортировать большие данные, используя Laravel Excel в очереди . Это работает нормально, если я удаляю метод заголовков из класса экспорта. Если я попытаюсь включить метод заголовков, это даст мне исключение.

FatalThrowableError: Return value of App\Exports\DataTablesExport::headings() must be of the type array, null returned in DataTablesExport.php:72

В моем контроллере

/**
   * @var $query \Illuminate\Database\Eloquent\Builder
     */

    $columns = array_keys($query->first()->toArray());

    (new DataTablesExport($query, $columns))->queue($file)->chain([
        new NotifyAdminOfCompletedExport(request()->user(), $file)
    ]);

В классе экспорта

<?php

namespace App\Exports;

use Illuminate\Bus\Queueable;
use Illuminate\Database\Connection;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithCustomQuerySize;

class DataTablesExport implements FromQuery, WithCustomQuerySize, WithHeadings, ShouldQueue
{
    use Queueable, SerializesModels, Exportable, InteractsWithQueue;

    /**
     * @var Builder
     */
    private $query;
    private $columns;

    /**
     * DataTablesExport constructor.
     * @param Builder $query
     * @param array $columns
     */
    public function __construct(Builder $query, array $columns)
    {
        $this->query = $query;
        $this->columns = $columns;
    }


    /**
     * @inheritDoc
     */
    public function query()
    {
        return $this->query;
    }

    /**
     * @inheritDoc
     */
    public function querySize(): int
    {
        return $this->query->count();
    }


    public function __sleep()
    {
        return []; //Pass the names of the variables that should be serialised here
    }

    public function __wakeup()
    {
        //Since we can't serialize the connection we need to re-open it when we unserialise
        $this->connection = app(Connection::class);
    }


    /**
     * @return array
     */
    public function headings(): array
    {
        return $this->columns;
    }
}

Драйвер очереди: Redis

Сообщение об исключении из таблицы laravel failed_jobs (Symfony \ Component \ Debug \ Exception \ FatalThrowableError: Возвращаемое значение App \ Exports \ DataTablesExport :: headings () должен иметь тип массива, ноль возвращается в DataTablesExport. php: 72)

Эта реализация работает, если я удалил метод заголовков из класса DataTableExport

Есть предложения по добавлению заголовков в файл Excel, который я пытаюсь экспортировать?

...