Статьи

Понимать объекты реестра и загрузчика в OpenCart

OpenCart стал очень полезной платформой электронной коммерции для малых и средних интернет-магазинов. Несмотря на то, что он предоставляет комплексные функции в своем стеке, он поддерживает простую структуру с хорошей модульной архитектурой, которая может быть расширена. В этой статье мы сосредоточимся на определенных элементах процесса начальной загрузки.

Хотя в типичном процессе начальной загрузки задействовано множество компонентов, мы сосредоточимся на объектах «Registry» и «Loader» в этом руководстве. Фрагменты кода, описанные в этой статье, относятся к OpenCart версии 2.0.x. Хотя код класса «Registry» в версиях 1.5.x и 2.0.x одинаков, код класса «Loader» сильно изменился. Поэтому мы сосредоточимся на версии OpenCart 2.0.x.

Как следует из названия, объект «Реестр» используется для хранения элементов, от простых переменных до сложных объектов, когда вызывается метод «set». Он хранит все элементы, используя «ключ», поэтому позже к ним можно легко получить доступ при вызове метода «get».

Давайте подробнее рассмотрим сам файл класса. Откройте файл, расположенный в «system / engine / registry.php» в вашем любимом текстовом редакторе!

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?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]);
  }
}

Как видите, определение класса довольно просто для понимания. Он хранит все в свойстве «data» объекта, которое объявлено как массив, и область действия является частной. В методе «get» он проверяет, доступно ли «value» для требуемого «ключа», и возвращает значение, если оно доступно, и «null» в противном случае. В методе «set» он вставляет новый элемент в массив «data», используя аргументы, переданные методу. Наконец, он предоставляет метод «has», чтобы проверить, установлен ли определенный «ключ» в массив «data».

Теперь давайте посмотрим, как платформа OpenCart использует объект реестра во время начальной фазы выполнения страницы. Откройте файл «index.php» в корне документа OpenCart. Вы увидите, что объект $registry создается очень рано при выполнении скрипта.

1
2
// Registry
$registry = new Registry();

После создания объекта $registry он сохраняет несколько других объектов, используя метод «set». Давайте посмотрим пару примеров.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?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 . Как вы могли заметить, часто используемые объекты создаются и хранятся в реестре. Причина в том, что вам не нужно создавать экземпляры объектов общего класса несколько раз, поэтому вы можете просто вызвать метод «get» объекта $registry для использования нужного объекта. Этот подход несколько похож на «шаблон Singleton», в котором вы вынуждены хранить один экземпляр класса.

Теперь объект $registry заполнен полезными данными, но как его использовать? Давайте посмотрим, как объект $db хранящийся в $registry , используется в модели «Activity» модуля «Account». Откройте файл, расположенный по адресу «каталог / модель / учетная запись / деятельность.php». Вы можете видеть, что в методе «addActivity» выполняется запрос на вставку.

1
2
3
4
5
$this->db->query(«INSERT INTO `» . DB_PREFIX . «customer_activity`
SET `customer_id` = ‘» . (int)$customer_id . «‘, `key` = ‘» .
$this->db->escape($key) .
«‘, `ip` = ‘» .
«‘, `date_added`= NOW()»);

Вы можете задаться вопросом о том, как он вызывается, поскольку в классе ModelAccountActivity нет метода или свойства db. Вы можете перейти к родительскому классу модели «Модель», чтобы увидеть, определен он там или нет. Да, вы не найдете метод или свойство «db» в этом классе. Но если вы внимательно посмотрите на класс «Модель», то увидите, что он реализует магические методы, в частности, метод «__get» в этом случае.

1
2
3
public function __get($key) {
  return $this->registry->get($key);
}

Сейчас давайте предположим, что объект $registry хранится в защищенном свойстве «registry» класса «Model». Посмотрим, как оно хранится, когда экземпляр «Model» создается в классе «Loader».

Метод __get вызывается при вызове любого метода, который не определен в классе. В этом методе в качестве аргумента передается «db», поскольку мы пытаемся вызвать $this->db в файле «activity.php». И, как обсуждалось ранее, $registry содержит все служебные объекты, уже сохраненные во время процесса начальной загрузки. Поэтому нам просто нужно извлечь объект «db» с помощью ключа, вызвав метод «get» объекта «Registry»!

Таким же образом, $this->load работает и с файлами контроллера. Таким образом, в целом, «Реестр» является действительно полезным компонентом платформы OpenCart, которая хранит часто используемые переменные и объекты, которые используются во время выполнения скрипта.

Объект «Loader» используется для загрузки различных компонентов OpenCart по мере необходимости, таких как модель, контроллер, язык, представление, библиотека и т. Д. Здесь важно отметить, что при создании объекта «Loader» он сохраняется в $registry объект с «load» в качестве ключа массива. Таким образом, вы можете получить доступ к объекту $loader с помощью вызова $this->load как описано в предыдущем разделе.

1
2
3
// Loader instantiation
$loader = new Loader($registry);
$registry->set(‘load’, $loader);

Теперь давайте посмотрим, как разные компоненты загружаются с помощью «Загрузчика». Откройте «system / engine / loader.php», чтобы увидеть определение класса «Loader». Мы начнем с метода «контроллера», чтобы понять, как он работает.

1
2
// load controller
$this->load->controller(‘common/column_left’);

Это фрагмент кода, который загружает контроллер «common / column_left.php» и также вызывает метод «index». Мы делаем этот вызов, чтобы получить вывод XHTML «левого столбца» страницы OpenCart. Часть $this->load работает аналогично примеру $this->db который я объяснил ранее! Таким образом, он возвращает объект $loader хранящийся в $registry , и, наконец, вызывает метод «controller» класса «Loader»!

Таким же образом следующие фрагменты работают для загрузки различных компонентов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
// 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».

В целом, «Registry» и «Loader» — это два очень важных компонента в платформе OpenCart, которые значительно упрощают работу разработчиков модулей.

Итак, сегодня мы рассмотрели компоненты «Loader» и «Registry» платформы OpenCart. Я надеюсь, что вы узнали что-то полезное из этого урока. И, надеюсь, я придумаю что-нибудь еще на ту же тему! Отправьте ваши вопросы и предложения, используя канал ниже!