Laravel-excel: [FRAGE] nach dem Importereignis

Erstellt am 7. Dez. 2018  ·  24Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Voraussetzungen

Versionen

  • PHP-Version: 7.2
  • Laravel-Version: 5.7
  • Paketversion: 3.1

Beschreibung

Ich habe einige Probleme, das After-Import-Ereignis zum Laufen zu bringen. Die Veranstaltung wird nie ausgelöst. :(
Das After Sheet funktioniert gut. Was mache ich falsch?

Ich habe sowohl die Registerereignisse als auch die automatischen Registerereignisse ausprobiert.

Mein Code

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

Hilfreichster Kommentar

Die nächste Version (derzeit 3.1-dev) unterstützt Before / AfterImport-Ereignisse für das Lesen von Chunks. Außerdem wird ein ImportFailed -Ereignis hinzugefügt, das ausgelöst wird, wenn einer der Chunk-Jobs fehlschlägt. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

Fühlen Sie sich frei, es auf dem 3.1-Zweig zu testen und lassen Sie mich wissen, ob es wie ausgenommen funktioniert.

Alle 24 Kommentare

Ich habe das gleiche Problem. Es scheint, dass das AfterImport -Ereignis niemals ausgelöst wird, wenn Sie den WithChunkReading -Vertrag implementieren.

Dies scheint auch für das BeforeImport-Ereignis zu gelten

Ich habe mir den Code kurz angesehen und kann in der ChunkReader-Klasse keinen Code sehen, der dieses Ereignis überhaupt auslöst.

Und wenn ich darüber nachdenke, gibt es dafür keine gute Lösung. Vielleicht könnte eine Lösung darin bestehen, der Kette einen einzelnen Job hinzuzufügen, damit die afterImport-Methode ausgelöst wird?

Haben wir Antworten auf dieses Thema? :) :)

Ja, wir haben dies als Fehler identifiziert. Wir werden sehen, ob wir in einer zukünftigen Version eine Lösung dafür finden können.

@GlennM Wenn ich damit

BeforeChunk- und AfterChunk-Sound möglich.

Die BeforeImport / AfterImport sind schwieriger. Das Hinzufügen von 2 zusätzlichen Jobs zur Kette wirkt sich auf die Leistung aus, da die Datei zweimal neu geöffnet wird. Die beste Option wäre, den Vorimport nur beim ersten Job und den Nachimport beim letzten Job auszuführen. Ich werde sehen, ob das möglich ist.

+1 zum Hinzufügen von BeforeImport / AfterImport-Ereignissen zu Blockjobs. Ich wollte gerade einen Vorschlag einreichen, um diese als zwei Jobs zur Kette hinzuzufügen, aber es hört sich so an, als wären Sie bereits dabei! Ihr Vorschlag, die Ereignisse beim ersten und letzten Job zu implementieren, klingt nach Möglichkeit auch am besten.

AfterImport funktioniert nicht mit ShouldQueue und WithChunkReading.
Darüber hinaus sind sie für Warteschlangen erforderlich, sodass ein Ereignis am Ende der Ausführung einer Warteschlange nicht implementiert wird.

mit dem Vorschlag der Dokumentation:

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

Jedes der Warteschlangenelemente wird ausgelöst: NotifyUserOfCompletedImport

Alguma sugestão?

Ich bin auf das gleiche Problem gestoßen. Es wurde behoben, indem ein Job erstellt wurde, der ShouldQueue implementiert, dann der Import ausgeführt und die erforderlichen Aktionen ausgeführt wurden (die sich sonst im Ereignis afterImport befinden würden), nachdem der Import abgeschlossen wurde. Der Import hat Batch-Einfügungen und das Lesen von Chunks konfiguriert und wird im Job synchron ausgeführt.

Ein Vorteil des oben genannten ist, dass ich leicht steuern kann, welcher Warteschlangenarbeiter den Job ausführt.

Ein weiterer (sehr wichtiger) Vorteil ist, dass ich XLS-Dateien mit dem Job in der Warteschlange importieren kann. Dies ist nicht möglich, wenn der Standardansatz für die Implementierung von ShouldQueue in der Importklasse selbst verwendet wird.

Ich habe die gleiche Frage 。。。 wie kann ich tun .... bitte

@ zxl2006001 Mit der aktualisierten Dokumentation von @patrickbrouwers habe ich mein Problem mit dieser Logik gelöst.

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

siehe hier: https://docs.laravel-excel.com/3.1/imports/queued.html#appending -jobs

Es gibt tatsächlich zwei weitere Konsequenzen des aktuellen Designs:

  1. Bei der Lesemethode für Reader-Klassen ist es nicht offensichtlich, warum beforeImport nur innerhalb von beforeReading ausgelöst wird, anstatt synchron ausgelöst zu werden, bevor ChunkReader-Lesevorgänge aufgerufen werden.

  2. In einem Chunked-Szenario können Sie einen Job verketten, um Benachrichtigungsaufgaben zu erledigen. Da jedoch die Eigenschaft "currentFile" geschützt ist, können Sie die temporäre Datei nicht ordnungsgemäß bereinigen und sie wird nicht automatisch ausgeführt. Ein Job, der nach allen ReadChunk-Dateien verkettet ist, wäre sowohl bei afterImport als auch bei sehr hilfreich temporäre Bereinigung.

Haben wir Problemumgehungen für die Behandlung fehlgeschlagener Importe? Die einzige Methode, an die ich derzeit denken kann, ist die Verwendung des globalen Jobfehlerereignisses von laravels.

Das Problem dabei ist, dass ich keine Kontrolle über den Prozess aatwebsiteExcel \ Jobs \ ReadChunk habe. Dies bedeutet, dass ich dem globalen Ereignis nicht die Daten übergeben kann, die ich für den fehlgeschlagenen Job benötige.

Wie können wir mit Fehlern umgehen, wenn wir chunkSize verwenden?

Die nächste Version (derzeit 3.1-dev) unterstützt Before / AfterImport-Ereignisse für das Lesen von Chunks. Außerdem wird ein ImportFailed -Ereignis hinzugefügt, das ausgelöst wird, wenn einer der Chunk-Jobs fehlschlägt. (https://twitter.com/patrickbrouwers/status/1114166252711415808)

Fühlen Sie sich frei, es auf dem 3.1-Zweig zu testen und lassen Sie mich wissen, ob es wie ausgenommen funktioniert.

Wenn ich den database Warteschlangentreiber für Importe verwende und WithChunkReading in meiner Importklasse implementiere, wird das Ereignis AfterImport mehrmals ausgelöst. Ist das erwartetes Verhalten?

Ich habe die Erfahrung, dass AfterImport nach jedem erfolgreichen Import zweimal ausgelöst wird, mit database Warteschlangentreiber und Version 3.1 .

Ich erlebe, dass AfterImport nach einem erfolgreichen Import auf unbestimmte Zeit ausgelöst wird, auch mit dem Warteschlangentreiber database und der Version 3.1

Wenn ich den Redis- Warteschlangentreiber für Importe verwende und WithChunkReading in meiner AfterImport- Ereignis mehrmals

Hier ist das Fehlerprotokoll:

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

Gleich wird ihr AfterImport zweimal aufgerufen.

Ich stoße auch auf AfterImport-Listener, die zweimal angerufen werden. Nach dem Debuggen mit xdebug stellte ich fest, dass die Listener an zwei Stellen registriert sind:

Für die nächste Version behoben

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen