了解OpenCart中的注册表和加载程序对象

介绍

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值