Laravel-excel: [PERTANYAAN] setelah acara impor

Dibuat pada 7 Des 2018  ·  24Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Prasyarat

Versi

  • Versi PHP: 7.2.2
  • Versi Laravel: 5.7
  • Versi paket: 3.1.0

Deskripsi

Saya mengalami masalah dalam menjalankan acara setelah impor. Peristiwa itu tidak pernah terjadi. :(
Lembar setelahnya berfungsi dengan baik, apa yang saya lakukan salah?

Saya telah mencoba event register dan event auto register.

Kode saya

namespace App\Imports;

use App\Order;
use App\Order\Address;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Events\AfterImport;
use Maatwebsite\Excel\Events\BeforeImport;

class OrderAddressImport implements
    WithHeadingRow,
    ToModel,
    WithBatchInserts,
    WithChunkReading,
    WithCustomCsvSettings,
    ShouldQueue,
    WithEvents
{
    use Importable, RegistersEventListeners;

    protected $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
     * <strong i="16">@param</strong> array $row
     * <strong i="17">@return</strong> Address
     */
    public function model(array $row)
    {
        $data = ['order_id' => $this->order->id];
        $data = array_merge($data, $row);

        return new Address($data);
    }


    public function batchSize() : int
    {
        return 1000;
    }

    public function chunkSize() : int
    {
        return 5000;
    }

    /**
     * <strong i="18">@return</strong> array
     */
    public function getCsvSettings(): array
    {
        return [
            'delimiter' => ';',
            'enclosure' => '',
            'input_encoding' => 'UTF-8'
        ];
    }

    public static function afterImport(AfterImport $event)
    {
       dd($event);
    }
}
bug

Komentar yang paling membantu

Rilis berikutnya (saat ini 3.1-dev) akan memiliki dukungan untuk acara Sebelum / SetelahImport untuk membaca potongan. Ini juga akan menambahkan acara ImportFailed yang dimunculkan ketika salah satu pekerjaan potongan gagal. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

Jangan ragu untuk mengujinya di cabang 3.1 dan beri tahu saya jika berfungsi seperti yang dikecualikan.

Semua 24 komentar

Saya memiliki masalah yang sama. Tampaknya peristiwa AfterImport tidak pernah diaktifkan jika Anda menerapkan kontrak WithChunkReading .

Ini tampaknya juga berlaku untuk acara BeforeImport

Saya telah melihat sekilas kode tersebut dan tidak dapat melihat kode apa pun yang akan mengaktifkan peristiwa ini sama sekali di kelas ChunkReader.

Dan ketika saya memikirkannya, tidak ada solusi yang bagus untuk ini. Mungkin satu solusinya adalah mengiklankan satu pekerjaan ke rantai untuk meningkatkan metode afterImport?

Apakah kami punya jawaban untuk topik ini? :)

Ya, kami telah mengidentifikasi ini sebagai bug. Kami akan melihat apakah kami dapat menemukan solusi untuk itu di versi yang akan datang.

@GlennM Berbicara dengan ini, saya ingin melihat apakah ada cara untuk juga mengimplementasikan acara BeforeChunk dan AfterChunk, untuk dapat memperbarui gui kemajuan front end saat bekerja ... Hal-hal yang perlu dipertimbangkan dengan ini , harus jumlah total + potongan total + potongan saat ini (hanya untuk pemikiran), sebagian besar file saya dilakukan melalui GUI tetapi cukup besar, jadi dapat memberi mereka semacam "sedang dalam proses" lebih baik daripada yang tidak pasti bilah kemajuan

Suara BeforeChunk dan AfterChunk dimungkinkan.

BeforeImport / AfterImport lebih rumit. Menambahkannya sebagai 2 pekerjaan tambahan ke rantai, akan berdampak pada kinerja, karena ini akan membuka kembali file 2x kali. Pilihan terbaik adalah hanya dapat menjalankan impor sebelum pada pekerjaan pertama dan impor setelah pada pekerjaan terakhir. Saya akan melihat apakah itu mungkin.

+1 untuk menambahkan acara BeforeImport / AfterImport ke pekerjaan chunk. Saya akan mengajukan proposal untuk menambahkan ini sebagai dua pekerjaan ke rantai, tetapi sepertinya Anda sudah melakukannya! Saran Anda untuk mengimplementasikan acara pada pekerjaan pertama dan terakhir juga terdengar paling baik jika memungkinkan.

AfterImport tidak berfungsi dengan ShouldQueue dan WithChunkReading.
Selain itu, mereka diperlukan untuk antrian, jadi acara di akhir menjalankan antrian tidak diimplementasikan.

dengan saran dokumentasi:

$ import-> antrian ('users.xlsx') -> chain ([
baru NotifyUserOfCompletedImport (request () -> user ()),
]);

Setiap item antrian diaktifkan: NotifyUserOfCompletedImport

Alguma sugestão?

Saya mengalami masalah yang sama. Memecahkannya dengan membuat Job yang mengimplementasikan ShouldQueue, lalu menjalankan Import darinya dan melakukan tindakan yang diperlukan (yang sebaliknya akan berada di event afterImport) setelah Import selesai. Impor telah mengonfigurasi penyisipan batch dan pembacaan potongan dan dijalankan secara sinkron dalam Pekerjaan.

Salah satu manfaat di atas adalah saya dapat dengan mudah mengontrol pekerja Antrian mana yang menjalankan pekerjaan.

dan keuntungan lain (yang sangat penting) adalah saya dapat mengimpor file XLS dengan pekerjaan yang diantrekan. Sesuatu yang tidak mungkin jika menggunakan pendekatan standar dengan mengimplementasikan ShouldQueue di kelas Import itu sendiri.

Saya memiliki pertanyaan yang sama 。。。 bagaimana saya bisa melakukannya .... tolong

@ zxl2006001 Dengan dokumentasi yang diperbarui dari @patrickbrouwers saya memecahkan masalah saya dengan logika ini.

(new UsersImport)->queue('users.xlsx')->chain([
    new NotifyUserOfCompletedImport(request()->user()),
]); 

lihat di sini: https://docs.laravel-excel.com/3.1/imports/queued.html#appending -jobs

Sebenarnya ada dua konsekuensi lagi dari desain saat ini:

  1. Melihat metode membaca kelas Pembaca, tidak jelas mengapa beforeImport diaktifkan hanya di dalam beforeReading alih-alih diaktifkan secara sinkron sebelum pembacaan ChunkReader dipanggil.

  2. Dalam skenario chunked Anda dapat merantai pekerjaan untuk melakukan hal-hal pemberitahuan tetapi karena properti "currentFile" dilindungi, Anda tidak dapat melakukan pembersihan file sementara yang benar dan itu tidak dilakukan secara otomatis - pekerjaan yang dirantai setelah semua ReadChunk akan sangat membantu baik dengan afterImport dan dengan pembersihan suhu.

Apakah kami memiliki solusi untuk menangani impor yang gagal? Satu-satunya metode yang saat ini dapat saya pikirkan adalah menggunakan peristiwa kesalahan pekerjaan global laravel.

Masalah dengan itu adalah saya tidak memiliki kendali atas proses aatwebsiteExcel \ Jobs \ ReadChunk. Ini berarti saya tidak bisa melewatkan acara global data yang saya butuhkan tentang pekerjaan yang gagal.

Bagaimana kami dapat menangani kesalahan saat menggunakan chunkSize?

Rilis berikutnya (saat ini 3.1-dev) akan memiliki dukungan untuk acara Sebelum / SetelahImport untuk membaca potongan. Ini juga akan menambahkan acara ImportFailed yang dimunculkan ketika salah satu pekerjaan potongan gagal. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

Jangan ragu untuk mengujinya di cabang 3.1 dan beri tahu saya jika berfungsi seperti yang dikecualikan.

Jika saya menggunakan database driver antrian untuk impor dan mengimplementasikan WithChunkReading pada kelas impor saya, ia akan memicu peristiwa AfterImport beberapa kali. Apakah itu perilaku yang diharapkan?

Saya mengalami AfterImport dipicu dua kali setelah setiap impor berhasil, dengan driver antrian database dan versi 3.1 .

Saya mengalami AfterImport dipicu tanpa batas waktu setelah menjalankan impor yang berhasil juga dengan driver antrian database dan versi 3.1

Jika saya menggunakan driver antrian redis untuk impor dan mengimplementasikan WithChunkReading pada kelas impor saya, ia akan memicu peristiwa AfterImport beberapa kali. Apakah itu perilaku yang diharapkan?

Ini log kesalahan:

local.ERROR: unlink(/Users/sineld/Code/project/public/uploads/tmp/laravel-excel-qfK6O5aCHxhFXioVayQbLQag5UnFKyxB.xlsx): No such file or directory {"exception":"[object] (ErrorException(code: 0):

Sama, AfterImport-nya dipanggil dua kali.

Saya juga bertemu dengan pendengar AfterImport yang dipanggil dua kali. Setelah men-debug dengan xdebug saya menemukan bahwa pendengar terdaftar di dua tempat:

Diperbaiki untuk rilis berikutnya

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

kertul picture kertul  ·  3Komentar

contifico picture contifico  ·  3Komentar

matthewslouismarie picture matthewslouismarie  ·  3Komentar

lucatamtam picture lucatamtam  ·  3Komentar

alejandri picture alejandri  ·  3Komentar