Opencart - Использование Объектов Registry И Loader В Начальной Загрузке

Тема в разделе "Общие вопросы", создана пользователем admin, 16 мар 2018.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

    Сообщения:
    2.674
    Симпатии:
    121.404
    Репутация:
    215
    OpenCart стал очень полезной платформой для eCommerce и интернет-магазинов низшего и среднего уровня. Он предоставляет комплексные функции в своем стеке, поддерживает простую структуру, с хорошей модульной архитектурой, которая может быть расширена. В этой статье мы сосредоточимся на некоторых элементах процесса начальной загрузки OpenCart.

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

    Объект Registry
    Как следует из названия, объект registry используется для хранения элементов, от простых переменных до сложных объектов, когда вызывается метод «set». Он хранит все элементы, используя «key» (“ключ”), поэтому позже к ним легче получить доступ, когда вызывается метод «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]);
    }
    }
    Как можно увидеть, определение класса довольно просто понять. Он хранит все в свойстве «data» объекта, который объявляется как массив, а область видимости private. В методе «get» он проверяет, доступно ли значение для желаемого «ключа», и оно возвращает значение, если оно доступно, и «null», если нет. В методе «set» он вставляет новый элемент в массив «data», используя аргументы, переданные методу. Наконец, он предоставляет метод «has», чтобы проверить, установлен ли определенный «ключ» в массив «data».

    Теперь давайте посмотрим, как среда OpenCart использует объект Registry на начальной стадии выполнения страницы. Откройте файл index.php в корневом каталоге документа OpenCart. Можно увидеть, что объект $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. Как вы могли заметить, часто используемые объекты создаются и сохраняются в реестре. Причина в том, что вам не нужно создавать экземпляры общих объектов класса несколько раз, поэтому вы можете просто вызвать метод «get» объекта $registry для использования желаемого объекта. Этот подход несколько похож на «Singleton Pattern», в котором вы вынуждены хранить один экземпляр класса.

    Теперь объект $registry заполнен полезными материалами, но как он используется? Посмотрим, как объект $db , хранящийся в нем, использует $registry в модели Activity модуля Account. Откройте файл, расположенный в каталоге / 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()");
    Вы можете задаться вопросом о том, как он называется, поскольку не существует метода или свойства «db», определенного в классе «ModelAccountActivity». Можно перейти к родительскому типу модели Model, чтобы узнать, определено это там или нет. Вы также не найдете метод или свойство «db» в этом классе. Но если внимательно посмотреть на класс Model, вы увидите, что он реализует магические методы, в частности метод «__get».

    Код:
    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. Таким образом, «Registry» — действительно полезный в рамках OpenCart компонент, в котором обычно хранятся переменные и объекты, которые используются во время выполнения скрипта.

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

    Код:
    // Loader instantiation
    $loader = new Loader($registry);
    $registry->set('load', $loader);
    Теперь давайте посмотрим, как загружаются различные компоненты с помощью «Loader». Откройте «system / engine / loader.php », чтобы увидеть определение класса «Loader». Мы начнем с метода «controller», чтобы понять, как он работает.

    Код:
    // load controller
    $this->load->controller('common/column_left');
    Это фрагмент кода, который загружает контроллер «common / column_left.php » и вызывает метод «index». Мы вызываем его, чтобы получить вывод XHTML «левой колонки» на странице OpenCart. Часть $this->load работает аналогично $this->db, что я объяснил ранее!

    Таким образом, возвращается объект $loader, хранящийся в файле $registry, и, наконец, вызывается метод controller класса «Loader»!

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

    Код:
    // 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. Надеюсь, вы научились чему-то полезному в этом уроке. И, надеюсь, я придумаю что-то большее по той же теме!