Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Symfony2]Robienie cache Entity poczas zapisu/updatu
Forum PHP.pl > Forum > PHP > Frameworki
athabus
Witam,
szukam rozwiązania takiego problemu. Mam 3 Entity/Tabele Rowery, Samochody, Motory.

Chciałbym zrobić z tych 3 tabel cache w tabeli Pojazdy. Działałby on tak, że podczas zapisu/updatu np. obiektu w tabeli Rowery tworzy się (lub aktualizuje) odpowiedni rekord w tabeli Pojazdy.

Próbowałem to zrobić za pomocą LifeCycleCallbacks, ale tam niestety nie ma możliwości zapisania obiektu w innej Tabeli. Mogę to oczywiście obsłużyć z poziomu kontrolera, ale wtedy musiałbym pamiętać, za każdym razem aby wywołać także update tego cache.

Na razie znalazłem jedno rozwiązanie - stworzenie globalnego EventListnera wywoływanego przy każdej operacji Persist - szczegóły rozwiązania. Niby w moim przypadku zadziała, ale wydaje mi się to trochę jak strzelanie z armaty do wróbla - może jest jakieś prostsze rozwiązanie?
pyro
Słowo-klucz, którego szukasz to prawdopodobnie Entity Listener, ale odpowiedni event jak napisałeś wyżej też nie jest złym rozwiązaniem.

// EDIT

Poza tym wnioskując po tym co piszesz prawdopodobnie masz złe założenia (źle zaprojektowaną bazę). Rower jest pojazdem i jest typem pojazdu, więc lepszym rozwiązaniem byłoby zapisywanie typu pojazdu jako właściwość encji.

// EDIT 2

Poza tym nie rozumiem co ma temat do cache
athabus
Przykład mocno uprościłem, żeby pokazać sedno problemu - prawdziwy przykład nawet nie ma nic wspólnego z pojazdami ;-)
Myślałem na początku o użyciu jednej tabeli do przechowywania obiektów, ale problemem było to, że każdy z tych obiektów miał sporo relacji z innymi obiektami etc. także łączenie tego w jedną tabelę byłoby kłopotliwe, albo wiązałoby się z wykonywaniem bardzo dużej liczby zbędnych zapytań. Długa historia.

Z Cachem chodzi o to, że w jednym miejscu potrzebuję dostępu można powiedzieć do wszystkich obiektów bez konieczności robienia podzapytań etc - chce po prostu zrobić Entity, który będzie cachem różnych typów obiektów i udostępni wspólny interfejs do pewnej funkcji, która będzie dość często wywoływana przez użytkowników - stąd właśnie nazywam to cache. Nie jest to optymalne z punktu widzenia relacyjności bazy, ale za to poprawi mi wydajność najbardziej zasobożernej części aplikacji, bo zapisy/updaty robione będą sporadycznie, a w większości przypadków będzie potrzeba wyszukiwania w okrojonym zakresie danych.

Co do EntityListner to masz rację - chyba właśnie tego potrzebuję:-) Zobaczę czy uda mi się zrobić zapis do bazy tak jak w zwykłym listnerze.
Dzięki za pomoc.

//edit
widzę, że można to chyba zrobić jeszcze prościej od wersji 2.4
  1. public function preUpdate(LifecycleEventArgs $args)
  2. {
  3.  
  4. die('preupada');
  5. }

LifecycleEventArgs ma dostęp do managera.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.