Wpis z mikrobloga

#doctrine #symfony #php

Mam takie coś:

/**
*
* @ORM\PreRemove
*/
public function groupSizePreRemove()
{
$this->getCosting()->resetOpenBandOppositeRateType();
}

/**
* @ORM\PostUpdate
*/
public function groupSizePostUpdate()
{
$this->getCosting()->resetOpenBandOppositeRateType();
}

potem w kontrolerze wołane jest persist i flush przy remove oraz tylko flush przy update.

Pytanie: Dlaczego zmiana w innym entity (costing) zapisuje się do bazy przy preRemove ale przy preUpdate lub postUpdate jest ignorowana?
  • 20
  • Odpowiedz
@gajowy_marucha: jak robisz update, to zmiana nie zapisuję się tylko jak robisz pusty update (nic się nie zmienia), czy zawsze? Miałem podobnie przy pustych update, wystarczyło zaktualizować jakiekolwiek pole np. znacznik czasowy updatedAt i wtedy postUpdate wykonywał się be problemu.
  • Odpowiedz
@kaesx: wlasnie event dziala dobrze, pole w entity costing jest zmienione ale potem sie nie zapisuje do bazy :/
To podstawowe entity ktorego robie update tez jest zawsze zmieniane wiec kompleteni nie wiem o co biega.
  • Odpowiedz
@kaesx: korzystam dość intensywnie z dziedziczenia musiałbym Ci połowe klas wrzucić:)

Jest tak: Robie remove entity A i wtedy w preRemove robię update dla niektórych elementów klasy C w kolekcji entity klasy B :) Wtedy działa. Dla update entity klasy A nie działa.

Pewnie nie rozjaśniłem :) no nic, draze dalej, pewnie to problem z cache czy co....
  • Odpowiedz
@gajowy_marucha: raczej nie w cache bym szukał winnego :) miałem kiedyś podobny problem pamiętam - też zachodziłem w głowę o co biega i jeśli nie mylę się eventy nie wywoływały się, kiedy nic się nie zmieniało. U mnie pomogło dodanie aktualizacji znacznika czasowego w preUpdate, czy tam postUpdate.
  • Odpowiedz
@kaesx: Używam listeners, nawet teraz przenoszę to do mojego EntityListener. Problem z listenerami mam taki że ta logika będzie "|gdzieś tam z boku" i łatwo zapomnieć że coś takiego się dzieje przy update akurat tego enituty. W ciele Encji wszystko jest jak na dłoni.
  • Odpowiedz
@gajowy_marucha: to takie serialize-unserialize dla ORM, w okolicach 20 minuty jakoś o tym mówi. Źle się wyraziłem, używa się tego na encjach, ale na 99% przypadków można i powinno się uniknąć. Z własnego doświadczenia i obserwacji rozwoju innych programistów sprawa wygląda tak: nie znasz eventów -> poznajesz eventy -> "ej to zajebiste użyjmy tego do operacji przed usunięciem" -> "dorzućmy jeszcze preupdate" -> "ej #!$%@? osochozi, czemu to się zmienia/nie
  • Odpowiedz
@DanioPL: wiesz co pod skórą czułem że te eventy mogą być zwodnicze, szczególnie jak jest milion listenerów i każdy ma tam coś z logiki biznesowej. Dlatego starałem się trzymać wszystko w encjach.
Chyba jestem na etapie "nie ogarniam kuwety:)"
  • Odpowiedz
groupSizePreRemove()


@gajowy_marucha: Unikaj w encji nazw typu PreRemove – nie ma znaczenia, że odpalasz to akurat przed usunięciem. Możesz przecież normalnie „ręcznie” odpalić sobie tę metodę z usługi czy kontrolera, więc wystarczy w nazwie samo groupSize(), bez wskazywania „kiedy”.

groupSizePreRemove
  • Odpowiedz