Förstå Registry and Loader Objects i OpenCart

Introduktion

OpenCart har blivit en mycket användbar e-handelsram för små och medelstora nätbutiker. Även om det ger omfattande funktioner i sin stapel, upprätthåller den en enkel ram, med en fin modulär arkitektur som kan utökas. I den här artikeln kommer vi att fokusera på vissa delar av bootstrapping-processen.

Även om det finns många komponenter som är inblandade i den typiska bootstrapping-processen, fokuserar vi på objektet "Registry" och "Loader" under kursens gång. Kodsutdrag som förklaras i den här artikeln hör till OpenCart version 2.0.x. Trots att "Registry" klasskoden är densamma i versioner 1.5.x och 2.0.x har klasskoden "Loader" ändrats mycket. Så vi fokuserar på 2.0.x-versionen av OpenCart.

Registerobjektet

Som namnet antyder används "Registry" -objektet för att lagra element, från enkla variabler till komplexa objekt, när "set" -metoden heter. Det lagrar alla element med "nyckel", så senare kan de nås enkelt när "get" -metoden heter. 

Låt oss ta en närmare titt på själva klassfilen. Öppna filen som finns på "system / engine / registry.php" i din favorit textredigerare!

data [$ key])? $ this-> data [$ key]: null);  public function set ($ key, $ value) $ this-> data [$ key] = $ värde;  offentliga funktionen har ($ key) return isset ($ this-> data [$ key]); 

Som du kan se är klassdefinitionen ganska enkel att förstå. Det lagrar allt i objektets "data" -egenskap, som deklareras som en array och omfattningen är privat. I "get" -metoden kontrollerar man om "värde" är tillgängligt för den önskade "nyckeln", och returnerar värdet om det är tillgängligt och "null" annars. I "set" -metoden sätter den det nya elementet in i "data" -raden med hjälp av de argument som överförs till metoden. Slutligen ger det "has" -metoden för att kontrollera om en viss "nyckel" redan är inställd i "data" -raden.

Låt oss nu se hur OpenCart-ramen använder registerobjektet under den första fasen av sidkörning. Öppna filen "index.php" i dokumentroten i OpenCart. Du kommer att se $ register objekt skapas mycket tidigt i exekveringen av manuset.

// Registry $ registry = nytt register ();

Efter skapandet av $ register objekt, det lagrar flera andra objekt med "set" -metoden. Låt oss se några exempel.

set ('load', $ loader); // Config $ config = new Config (); $ registry -> set ('config', $ config); // Databas $ db = ny DB (DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); $ registry -> set ('db', $ db); // Förfrågan $ request = new Request (); $ registry -> set ('request', $ request); // Session $ session = ny session (); $ registry -> set ('session', $ session);

Jag har listat här några exempel användningsområden av $ register objekt. Som du kanske har märkt skapas och lagras ofta använda objekt i registret. Anledningen är att du inte behöver instansera vanliga klassobjekt flera gånger, så du kan helt enkelt kalla "get" -metoden för $ register objekt att använda det önskade objektet. Tillvägagångssättet liknar något "Singleton Pattern", där du är tvungen att behålla en enda förekomst av klassen.

Nu den $ register Objektet är befolket med användbara saker, men hur används det? Låt oss se hur $ db objekt som är lagrat i $ register används i modulen "Aktivitet" i modulen "Konto". Öppna filen som finns på "katalog / modell / konto / activity.php". Du kan se att i en addActivity-metod slås en inläggsfråga av.

$ this-> db-> fråga ("INSERT INTO" ". DB_PREFIX." customer_activity "SET" customer_id '=' ". (int) $ customer_id." ',' key '=' ". $ this-> db- > escape ($ key). '', 'data' = '". $ this-> db-> escape (serialize ($ data)).' ',' ip '='". $ this-> db-> fly ($ this-> request-> server ['REMOTE_ADDR']). "',' date_added '= NU ()");

Du kanske undrar hur det heter, eftersom det inte finns någon "db" -metod eller egenskap definierad i klassen "ModelAccountActivity". Du kan gå till modermodellklassen "Modell" för att se om den är definierad där eller ej. Ja, du hittar inte en "db" metod eller egendom i den klassen heller. Men om du tittar noggrant på klassen "Modell" ser du att den implementerar de magiska metoderna, särskilt "__get" -metoden i det här fallet.

offentlig funktion __get ($ key) return $ this-> registry-> get ($ key); 

För nu, låt oss anta att $ register objektet lagras i egenskapen "Model" i den skyddade "registret" -egenskapen. Vi får se hur den lagras när "Modell" är instansierad i klassen "Loader". 

De __skaffa sig Metoden heter när du ringer någon metod som inte är definierad i klassen. I denna metod passeras "db" som ett argument som vi försöker ringa $ Detta -> db i filen "activity.php". Och som diskuterats tidigare, $ register har alla verktygsobjekt som redan lagrats under bootstrapping-processen. Så vi behöver bara hämta "db" -objektet med nyckeln genom att kalla "get" -metoden i "Registry" -objektet!

På samma sätt, $ Detta -> lasten fungerar också från kontrollerfilerna. Så allmänt är "Registry" en väldigt användbar komponent i OpenCart-ramverket som lagrar vanliga variabler och objekt, som används under körning av manus.

Loader Object

Objektet "Loader" används för att ladda de olika komponenterna i OpenCart efter behov, som modell, kontroller, språk, vy, bibliotek etc. Det är viktigt att notera här att när "Loader" -objektet skapas lagras det i $ register objekt med "load" som en matrisnyckel. Så du kan komma åt $ loader objekt genom att använda en $ Detta -> lasten ring som förklarad i ovanstående avsnitt.

// Loader instantiation $ loader = ny Loader ($ registry); $ registry -> set ('load', $ loader);

Nu ska vi se hur olika komponenter laddas med "Loader". Öppna "system / engine / loader.php" för att se definitionen av en "Loader" -klass. Vi börjar med "controller" -metoden för att förstå hur det fungerar.

// load controller $ this-> load-> controller ('common / column_left');

Det är en kodbit som laddar "common / column_left.php" -kontrollen och kallar också "index" -metoden. Vi gör detta samtal för att få XHTML-utgången från "Vänster kolumn" på OpenCart-sidan. De $ Detta -> lasten Delar fungerar som $ Detta -> db exempel som jag förklarade tidigare! Således returnerar den $ loader objekt som är lagrat i $ register, och till sist kommer det att kallas "controller" -metoden i klassen "Loader"!

På samma sätt fungerar följande snippets för att ladda olika komponenter.

// ladda modell $ this -> load -> model ('catalog / category'); // load Visa $ this -> load -> view ('standard / mall / product / category.tpl', $ data); // ladda biblioteket $ this -> load -> library ('user'); // ladda hjälpen $ this -> load -> hjälpen ('json'); // ladda Språk $ this -> load -> language ('product / category');

Om man tittar på metoddefinitionerna i klassen "Loader" ser du att det inte är så komplicerat att förstå exakt hur det fungerar. Först förbereder den "filvägen" för motsvarande komponent, och den ingår med funktionen "include_once".

Sammantaget är "Registry" och "Loader" två mycket viktiga komponenter i OpenCart-ramverket som gör sakerna mycket enklare för modulutvecklare.

Slutsats

Så idag tittade vi på komponenterna "Loader" och "Registry" i OpenCart-ramen. Jag hoppas att du har lärt dig något användbart i denna handledning. Och förhoppningsvis kommer jag att komma med något mer på samma ämne! Skicka in dina frågor och förslag med hjälp av flödet nedan!