symfony - Do something when an Entity's attribute is modified -


संदर्भ

कल्पना करो मेरे पास एक रेल नेटवर्क है: स्टेशन को रेल द्वारा एक साथ लिंक किया जाता है।

  • मुझे रेल पर समय-समय पर रखरखाव करने की आवश्यकता है (मेरे पास रखरखाव इकाई है।)
  • स्टेशन इकाई विनाश दिनांक को शून्य से अलग करने के लिए विशेषता को सेट करके नष्ट किया जा सकता है।
  • 2 स्टेशनों के बीच के संबंध में "कई कई विशेषताओं" संबंध हैं, परिभाषित इकाई रेल
  • मुझे यह पता करने की आवश्यकता है कि कौन सा स्टेशन कनेक्ट / डिस्कनेक्ट किया गया है, जिसमें स्टेशन और जब ऐसा होता है मेरा रेल इकाई मेरे पास connectionDate और एक वियोग का दिनांक विशेषता है।

मुझे क्या चाहिए

  • जब मैं 2 स्टेशनों (यानी $ रेल-> सेट डिसेकनेक्शन डेट (अब ()) ) काट, संबंधित रखरखाव < / कोड> संस्थाओं को हटा दिया जाता है।
  • जब मैं एक स्टेशन (यानी $ station- & gt; setDestructionDate (अब ()) ) को नष्ट कर देता हूँ, संबंधित रेल एस डिस्कनेक्ट हो गए हैं (यानी <सह डी> $ रेल-> सेट डिस्ककनेक्शन डेट ($ station- & gt; getDestructionDate ) और संबंधित रखरखाव संस्थाएं हटाई जाती हैं।

कैसे उस हल करने के लिए

इस समय के लिए, मैं अपने नियंत्रकों के कार्यों में घटनाओं को चालू करता हूं और यह ठीक काम करता है। लेकिन समस्या ये है कि वे 2 स्टेशनों को तोड़ने या एक स्टेशन को नष्ट करने के लिए मेरे आवेदन में कई तरीके हैं और नियंत्रक के माध्यम से सभी मुर्गी नहीं निकलते हैं। मुझे यह सुनिश्चित करने की ज़रूरत है कि किसी स्टेशन के विनाश या रेल वियोजन को याद न करें।

इसलिए मैं इकाई में ट्रिगर ईवेंट के बारे में सोच रहा था, उदाहरण के लिए setDestructionDate () विधि में मैं वेब पर खोज करता हूं और जाहिरा तौर पर यह एक अच्छा विचार नहीं है।

मैं डॉक्टरेट के बाद अद्यतन घटनाओं का उपयोग करना चाहता हूं, लेकिन वे तब भी ट्रिगर हो सकते हैं जब विनाश तिथि संशोधित न हो। मैं इसे फिल्टर कर सकता था लेकिन मुझे यकीन नहीं है कि यह करना सबसे अच्छी बात है।

तो, आप उस समस्या को कैसे सुलझा लेंगे? इस मामले में सबसे अच्छा अभ्यास क्या है?

आप EventSubscriber बना सकते हैं और या तो preUpdate या onFlush ईवेंट सुन सकते हैं । पूर्व अद्यतन में आपके पास क्या बदलाव आया है इसकी एक्सेस है।

उदाहरण के लिए:

  वर्ग YourEventListener लागू करता है EventSubscriber {सार्वजनिक फ़ंक्शन getSubscribedEvents () {रिटर्न सरणी (ईवेंट :: preUpdate = & gt ; 'प्रीअपडेट'); } सार्वजनिक समारोह preUpdate (PreUpdateEventArgs $ eventArgs) {$ इकाई = $ eventArgs- & gt; getEntity (); $ Em = $ eventArgs- & gt; getEntityManager (); यदि ($ इकाई उदाहरण के लिए रेल) ​​{यदि ($ eventArgs- & gt; चाइल्डडफिल्ड ('डिस्कनेक्शन डेट')) {// कुछ करना}}}}  

Comments