Eager loading hat einige unerwartete Nebenwirkungen auf Model Events / Booten in Laravel

8

Ich versuche, einige Tests zu erstellen.

Hier ist meine Testklasse:

%Vor%

Der Test, der nicht bestanden wird, ist der zweite: Ich zähle die Zahl eloquenter Objektetüden, die am Anfang 10 sind, dann füge ich eine Etüde zur Datenbank hinzu (mit Etude :: create ()), die Objekt wird erstellt, weil $ etude- & gt; id eine reelle Zahl ausgibt. Howewer, die Nummer der Etüde wurde nicht aktualisiert.

Das Problem verschwindet, wenn ich die 'Etüde' aus dem eifrigen Laden in Action :: with ('Antworten', ...)

entferne

Hier ist die Etudes-Beziehung in der Action-Klasse:

%Vor%

Habt ihr eine Ahnung, ob das Begräbnis in Laravel so seltsames Verhalten haben kann und wie das zu beheben ist?

BEARBEITEN

Ich fand heraus, dass das Anrufen mit ("Etüde") die Aktion hatte, die im Eloquent Model registrierten Ereignisse zu entfernen:

boot Methode der Etüde:

%Vor%

Wenn ich Etude :: boot () am Anfang von testEtudes hinzufüge, funktioniert es wieder. Das ist immer noch seltsam.

Hat eifriges Laden irgendwelche Auswirkungen auf Ereignisse oder die Boot-Methode? Oder wird die Boot-Methode nicht automatisch nach jedem Test aufgerufen?

    
edi9999 22.11.2013, 17:03
quelle

1 Antwort

1

Bei Laravel-Tests wird der Event-Dispatcher zwischen jedem Test zurückgesetzt, aber die Modelle werden immer noch nur einmal gestartet, da sie ein ziemlich unabhängiges Leben führen. Dies bedeutet, dass die Modell-Listener zwischen den einzelnen Tests gelöscht, aber nie erneut registriert werden. Die Lösung besteht darin, nicht boot() für die Registrierung von Modellereignissen zu verwenden, sondern sie in einer separaten Datei zu speichern - entweder einen Dienstanbieter oder eine Datei aus app / start / global.php (app / events.php ist eine gebräuchliche) .

    
Andreas 04.12.2013, 09:04
quelle