介绍
OpenCart已成为中小型在线商店的非常有用的电子商务框架。 尽管它在其堆栈中提供了全面的功能,但它维护了一个简单的框架,并具有可以扩展的漂亮模块化体系结构。 在本文中,我们将重点介绍引导过程的某些元素。
尽管典型的引导过程涉及很多组件,但在本教程的过程中,我们将重点关注“ 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 {
private $data = array();
public function get($key) {
return (isset($this->data[$key]) ? $this->data[$key] : null);
}
public function set($key, $value) {
$this->data[$key] = $value;
}
public function has($key) {
return isset($this->data[$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) {
return $this->registry->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”组件。 希望您在本教程中学到了一些有用的东西。 希望我能针对同一主题提出更多建议! 使用下面的提要提交您的查询和建议!
翻译自: https://code.tutsplus.com/tutorials/understand-registry-and-loader-objects-in-opencart--cms-23702