儘管典型的引導過程涉及很多元件,但在本教程的過程中,我們將重點關注「 registry」和「 loader」物件。 本文介紹的**段屬於opencart 2.0.x版。 儘管「登錄檔」類**在1.5.x和2.0.x版中是相同的,但「裝載程式」類**已發生了很大變化。 因此,我們將專注於opencart的2.0.x版本。
顧名思義,當呼叫「 set」方法時,「登錄檔」物件用於儲存從簡單變數到複雜物件的元素。 它使用「鍵」儲存所有元素,因此稍後在呼叫「 get」方法時可以輕鬆訪問它們。
讓我們仔細看一下類檔案本身。 在您喜歡的文字編輯器中開啟位於「 system / engine / registry.php」的檔案!
<?php
final class registry
public function set($key, $value)
public function has($key)
}
如您所見,類定義非常容易理解。 它將所有內容儲存在物件的「資料」屬性中,該屬性宣告為陣列,作用域是私有的。 在「 get」方法中,它檢查「 value」是否可用於所需的「 key」,如果可用,則返回該值,否則返回「 null」。 在「 set」方法中,它使用傳遞給該方法的引數將新元素插入「 data」陣列。 最後,它提供了「具有」方法來檢查某個「鍵」是否已經設定到「資料」陣列中。
現在,讓我們看看opencart框架在頁面執行的初始階段如何使用登錄檔物件。 在opencart的文件根目錄中開啟「 index.php」檔案。 您會看到$registry
物件在指令碼執行的早期就建立了。
// registry
$registry = new registry();
建立$registry
物件後,它使用「 set」方法儲存其他幾個物件。 讓我們看幾個例子。
<?php
// loader
$loader = new loader($registry);
$registry->set('load', $loader);
// config
$config = new config();
$registry->set('config', $config);
// database
$db = new db(db_driver, db_hostname, db_username, db_password, db_database);
$registry->set('db', $db);
// request
$request = new request();
$registry->set('request', $request);
// session
$session = new session();
$registry->set('session', $session);
我在這裡列出了$registry
物件的一些用法示例。 您可能已經注意到,經常使用的物件被建立並儲存在登錄檔中。 原因是您不必多次例項化公共類物件,因此您只需呼叫$registry
物件的「 get」方法即可使用所需的物件。 該方法與「單人模式」(singleton pattern)有點相似,在這種情況下,您不得不保留該類的單個例項。
現在,$registry
物件填充了有用的東西,但是如何使用呢? 讓我們看看如何在「帳戶」模組的「活動」模型中使用儲存在$registry
的$db
物件。 開啟位於「 catalog / model / account / activity.php」的檔案。 您可以看到,在「 addactivity」方法中,觸發了插入查詢。
$this->db->query("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->escape($this->request->server['remote_addr']) .
"', `date_added`= now()");
您可能想知道它的呼叫方式,因為在「 modelaccountactivity」類中沒有定義「 db」方法或屬性。 您可以轉到父模型類「 model」以檢視是否在其中定義了它。 是的,您也不會在該類中找到「 db」方法或屬性。 但是,如果仔細觀察「 model」類,您會發現它實現了魔術方法,在這種情況下,尤其是「 __get」方法。
public function __get($key)
現在,讓我們假設$registry
物件儲存在「 model」類的受保護的「 registry」屬性中。 我們將看到在「 loader」類中例項化「 model」時如何儲存它。
當您呼叫類中未定義的任何方法時,將呼叫__get
方法。 在此方法中,當我們嘗試在「 activity.php」檔案中呼叫$this->db
,將「 db」作為引數傳遞。 如前所述,$registry
具有所有在引導過程中儲存的實用程式物件。 因此,我們只需要通過呼叫「 registry」物件的「 get」方法使用鍵來獲取「 db」物件!
同樣,$this->load
可以從控制器檔案中工作。 因此,總的來說,「登錄檔」是opencart框架中非常有用的元件,它儲存了指令碼執行過程中經常使用的常用變數和物件。
「 loader」物件用於根據需要載入opencart的不同元件,例如模型,控制器,語言,檢視,庫等。在此必須注意,當建立「 loader」物件時,它將儲存在$registry
物件,以「 load」作為陣列鍵。 因此,您可以使用$this->load
呼叫來訪問$loader
物件,如上一節所述。
// loader instantiation
$loader = new loader($registry);
$registry->set('load', $loader);
現在,讓我們看看如何使用「 loader」載入不同的元件。 開啟「 system / engine / loader.php」以檢視「 loader」類的定義。 我們將從「控制器」方法開始,以了解其工作方式。
// load controller
$this->load->controller('common/column_left');
這是乙個**片段,它載入「 common / column_left.php」控制器並呼叫「 index」方法。 我們進行此呼叫以獲取opencart頁面「左列」的xhtml輸出。$this->load
部分的工作原理與我之前解釋的$this->db
示例相似! 因此,它返回儲存在$registry
的$loader
物件,最後它將呼叫「 loader」類的「 controller」方法!
以同樣的方式,以下**片段可以載入不同的元件。
// load model
$this->load->model('catalog/category');
// load view
$this->load->view('default/template/product/category.tpl', $data);
// load library
$this->load->library('user');
// load helper
$this->load->helper('json');
// load language
$this->load->language('product/category');
檢視「 loader」類中的方法定義,您會發現準確了解其工作原理並不那麼複雜。 首先,它為相應的元件準備「檔案路徑」,並使用「 include_once」功能將其包括在內。
總體而言,「登錄檔」和「引導程式」是opencart框架中的兩個非常重要的元件,它們使模組開發人員的工作變得更加輕鬆。
因此,今天,我們研究了opencart框架的「 loader」和「 registry」元件。 希望您在本教程中學到了一些有用的東西。 希望我能針對同一主題提出更多建議! 使用下面的提要提交您的查詢和建議!
翻譯自:
了解登錄檔結構
在登錄檔中,所有的資料都是通過一種樹狀結構以鍵和子鍵的方式組織起來,就象我們的磁碟檔案系統的目錄結構一樣。每個鍵都包含了一組特定的資訊,每個鍵的鍵名都是和它所包含的資訊相關聯的。如果某個鍵包含了子鍵,則在登錄檔編輯器視窗中代表這個鍵的資料夾的左邊將有 符號,以表示在這個資料夾中有更多的內容。如果這個...
windows登錄檔 登錄檔的認識
登錄檔的特點 1.登錄檔允許對硬體 系統引數 應用程式和裝置驅動程式進行跟蹤配置,這使得修改某些設定後不用重新啟動成為可能。2.登錄檔中登入的硬體部分資料可以支援高版本的即插即用特性。當windows檢測到機器上的新裝置時,就把有關資料儲存到登錄檔中,另外,還可以避免新裝置與原有裝置之間的資源衝突。...
登錄檔學習筆記 登錄檔的位置
20180228 今天學習登錄檔的位置 文中說 在windows 98 me作業系統中,登錄檔主要由 system.dat 和 user.dat 這兩個登錄檔資料庫檔案組成。通常是在 c windows 中。system.dat包含系統硬體和軟體的設定,user.dat則儲存著與使用者有關的資訊。知...