![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 19.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie,
nie wiem czy uda mi się przedstawić sprawę bez wklejania kodu... spróbuję: Powiedzmy, że mam 3 encje: Stockinvoice - fakturaz zakupowa Stockinvoiceelement - poszczególne produkty na fakturze zakupowej Stock - magazyn przechowujący ilości poszczególnych produktów na magazynie cel jest taki aby każde wprowadzenie/edycja/usunięcie Stockinvoiceelement skutkowało aktualizacją ilości elementów Stock. na pierwszy rzut oka wydało mi się, że mógłbym to zrobić w Encji Stockinvoiceelement za pomocą serwisu w lifecycle callbacks (preInsert, preUpdate, preDelete) ale wszędzie piszą, że Encje nie powinny mieć dostępu do serwisów. Więc jak mam to zrobić po bożemu (wolał bym uniknąć triggerów mysql...) z góry dzięki Edit: Dokopałem się do czegoś co nazywa się Entity listener. Zostało zaimplementowane w doctrine 2.4 i chyba nie ma jeszcze przyzwoitej dokumentacji w SF2. Ktoś może próbował użyć takiego listenera? edit2: więc chyba się dokopałem, jeśli ktoś jest tak zielony w SF2 jak ja to może się mu przyda: MyBundle/Resources/config/services.yml Kod services: stockelementlistener: class:MyBundle\Listener\StockelementListener tags: - { name: doctrine.orm.entity_listener } calls: - [ setContainer, [ @service_container ]] MyBundle/Entity/Stockinvoiceelement.php Kod namespace MyBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping\EntityListeners; /** * Stockinvoiceelement * * @ORM\Table(name="m_stockinvoiceelements") * @ORM\Entity(repositoryClass="MyBundle\Entity\StockinvoiceelementRepository") * @ORM\Entity @EntityListeners({"MyBundle\Listener\StockelementListener"}) */ class Stockinvoiceelement { ... MyBundle/Listener/Stockelementlistener.php Kod namespace MyBundle\Listener; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use MyBundle\Entity\Stockinvoiceelement; use Doctrine\ORM\Event\PreUpdateEventArgs; use Doctrine\Common\Persistence\Event\LifecycleEventArgs; use MyBundle\Entity\Stock; class StockelementListener extends Controller { public function prePersist(Stockinvoiceelement $stockinvoiceelement, LifecycleEventArgs $event){ ... } ps. to działa i wydaje się, że to może być właściwa droga ale jeśli ktoś zna lepsze rozwiązanie to proszę o info coby nie brnąć w ślepą uliczkę. Ten post edytował longinustorwaldzki 12.12.2014, 23:26:14 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 82 Pomógł: 22 Dołączył: 20.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
troche juz minelo, ale najlepsza decyzja wydaje sie uzycie kilku listenerow: doctrine.event_listener albo jednego subscribera doctrine.event_subscriber:
http://symfony.com/doc/current/cookbook/do...ubscribers.html Nie trzeba wtedy wstrzykiwac kontenerow, extendowac konrollerow itp. Tworzymy jeden EventSubscrier, w metodzie getSubscribedEvents dodajemy eventy, ktorych chcemy sluchac (np. postPersist, postUpdate i postRemove) a w ich implementacji wykonujemy operacje na encji Stock tylko jesli w evencie mamy docznienia z encja Stockinvoiceelement. Do subscribera (jako ze jest to serwis) wstrzykujemy tylko potrzebne rzeczy (encje Stock dostaniemy w triggerowanym evencie). |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 10:58 |