Förstå Magento Observers

Magento har ett ganska bra implementerat Event / Observer-system, men innan vi dyker in i detaljerna, låt oss se till att vi har en klar förståelse för de designmönster som spelas i Magento-applikationen.

Specifikt kan vi prata om begreppet händelsessystem, hur det fungerar och vad det är. Även om vi har täckt vissa designmönster i andra artiklar om Tuts +, har vi inte gjort det inom Magento. 

Låt oss ta en titt på mönstret för att få en klar förståelse för hur det är, hur det fungerar och hur det är fördelaktigt.

Designmönster som helhet

Under årens lopp har ett stort antal mönster utvecklats. Men vad är ett designmönster exakt?

Att citera Wikpedia:

"I mjukvaruutveckling är ett designmönster en generell återanvändbar lösning på ett vanligt förekommande problem inom ett visst sammanhang i mjukvaruutveckling."

Om vi ​​sänker det lite är vi kvar: ett designmönster är en återanvändbar lösning på ett vanligt problem. Det är så perfekt en beskrivning. 

Designmönstret är en mall som kan användas för att skapa en lösning som kommer att passa problem av samma natur. Mönstret i sig är inte den faktiska lösningen, det definierar hur lösningen kan implementeras som en riktlinje. 

Din faktiska lösning, även om du klarar av det definierade mönstret, kan skilja sig från mina så länge de båda följer de riktlinjer som anges av designmönstret.

Observermönstret

Nu när vi vet vad ett designmönster verkligen är, kan vi titta på Observer-mönstret.

Först implementerad i MVC-arkitekturen har Observer Pattern visat sig vara ett mycket värdefullt tillägg till arkitekturen. Delvis på grund av detta har en enorm mängd bibliotek implementerat mönstret över tiden och om du har programmerat ett tag är det inte osannolikt att du redan har använt det.

Nog historia men låt oss ta en titt på hur det fungerar.

Att observera är att titta på det, eller att observera dess tillstånd. I ett tekniskt sammanhang är detta inte annorlunda. Observatörer per definition ser på något och i vårt fall, händelser. Tanken här är att om en händelse skickas skickas observatörer som observerar detta evenemang. 

Generellt kommer ämnet som observeras att överföras genom hänvisning för att observatören ska kunna uppdatera eller kontrollera den för ändringar.

Kolla in det här exemplet från Magento-koden:

klass Mage_Catalog_Model_Product extends Mage_Catalog_Model_Abstract public function validate () Mage :: dispatchEvent ('catalog_product_validate_before', array ('product' => $ this)); $ Detta -> _ getResource () -> validera ($ this); Mage :: dispatchEvent ('catalog_product_validate_after', array ('product' => $ this)); returnera $ this; 

Okej, så det här är valideringsmetoden som den är tillgänglig i din körning av bruket Magento-installationen. För tydligheten ersatte jag två variabler med deras faktiska värden. Du kan se att två händelser skickas här. catalog_product_validate_before och catalog_product_validate_after, var och en av dessa ger produktobjektet tillsammans med sändningen så att observatören kan göra något med det.

klass Enterprise_AdminGws_Model_Models utökar Enterprise_AdminGws_Model_Observer_Abstract public function catalogProductValidateAfter (Varien_Event_Observer $ observatör) if ($ this -> _ role-> getIsAll ()) return;  $ product = $ observator-> getEvent () -> getProduct (); $ Detta -> _ forceAssignToWebsite ($ produkt-> getWebsiteIds ()); 

Och här är en observatörsklass och dess metod. Denna klass och metod är anslutna till systemet med Magentos konfigurationssystem. Evenemanget själv överlämnas till observatörsklassen och produkten kan nås från evenemanget.

Jag kommer att täcka de faktiska skapandet och anslutningen av observatörer såväl som att nå ämnena med mer detaljer i nästa inlägg.

Varför använda detta mönster?

Ett av de främsta argumenten att använda Observer-mönstret, eller dess nära släktingar som Pub / Sub-mönstret, är modulariteten det ger.

Eftersom allting kan kopplas till en händelse som skickas, har du aldrig en stark referens till det. Det här är utomordentligt användbart i en inställning där du alltid arbetar med moduler som kan eller kanske inte tillhandahåller tjänster till ett visst element som kanske eller inte är tillgängligt. 

För att kunna använda Magento igen kan jag bygga en modul som överensstämmer med produktändringar samt en modul som jag byggt som bränder av egna anpassade händelser. Nu, i ett vanligt system skulle denna modul vara beroende av den tidigare modulen, men med en Pub / Sub eller Observer Mönstret kan jag göra detta beroende valfritt och bara tillämpa vad det är min nuvarande modul till den när den är tillgänglig.

Vad kommer härnäst?

Efter den här snabba uppfriskningen om vad exakt designmönster är och hur djupare det är på Observermönstret, kommer jag i nästa inlägg att förklara hur det används i Magento, hur du kan börja använda det i dina egna moduler och ge dem dem i dina egna moduler också att koppla in från olika, eller för andra att kroka in i.