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.
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);
}
}
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:
Melihat metode membaca kelas Pembaca, tidak jelas mengapa beforeImport diaktifkan hanya di dalam beforeReading alih-alih diaktifkan secara sinkron sebelum pembacaan ChunkReader dipanggil.
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
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.