Как в OpenCart доступ к своей библиотеке?

Как в OpenCart доступ к своей библиотеке?

02.04.2014 02:57:47 Просмотров 4 Источник

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

Мне интересно, как файл контроллера знает, как найти класс cart (например).

Например.

В каталоге / контроллере / кассе корзина есть (очевидно с кодом снято)

class ControllerCheckoutCart extends Controller {
    public function index() {
      $this->cart->update();
    }

}

Класс контроллера можно найти в system / engine / controller.РНР

update()можно найти system / library / cart.

Я предположил, что в контроллере.php там будет ссылка на класс cart, или объект, сделанный из него. (Я основываю это на использовании $this->).

Так как же класс cart на самом деле найден из контроллера?

Спасибо

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/22809285/how-does-opencart-access-its-library-classes#comment34785960_22809285
@MarkBaker - на самом деле это не так
https://stackoverflow.com/questions/22809285/how-does-opencart-access-its-library-classes#comment34785971_22809285
@MarkBaker это неверный ответ. Автозапуск вообще не используется в OpenCart.

Ответы - Как в OpenCart доступ к своей библиотеке? / How does OpenCart access its library classes?

deceze

02.04.2014 03:15:15

ControllerCheckoutCartрасширяет Controller, что означает, что он наследует весь код в Controller, который вы здесь не видите. Какой-то код в Controller, скорее всего в Controller::__construct, создает объект $this->cart. Пример:

class Controller {

    public function __construct() {
        $this->cart = new Cart;
    }

}

Поскольку этот конструктор наследуется всеми дочерними классами, они также создают свой собственный $this->cartи имеют доступ к нему в своих собственных методах.

https://stackoverflow.com/questions/22809285/how-does-opencart-access-its-library-classes/22809664#comment34785636_22809664
Спасибо за объяснение, к сожалению, в контроллере нет ничего подобного, поэтому, скорее всего, где-то еще что-то подобное объявляется.
https://stackoverflow.com/questions/22809285/how-does-opencart-access-its-library-classes/22809664#comment34786106_22809664
К сожалению, без знания OpenCart это не правильно. OpenCart использует какого-то поставщика услуг, в то время как все услуги должны быть зарегистрированы в реестре$registry. В классе контроллера при вызове $cartон всплывает к Loader, который получает этот зарегистрированный класс из реестра. Некоторые простые реализации МОК.
https://stackoverflow.com/questions/22809285/how-does-opencart-access-its-library-classes/22809664#comment34787534_22809664
@shadyyx да, специфика того, как $this->cartпоявится, конечно, будет отличаться. Главное-это наследование и любой магический код, который содержит контроллер.
Является ответом!
Jay Gilford

02.04.2014 03:44:13

Во-первых, ControllerCheckoutCartрасширяет класс Controller, так что это класс, на котором мы должны сосредоточиться. Вы можете найти этот класс в /system/engine/controller.php.

В этом классе есть два магических метода, которые нас интересуют. Первый-это __construct, в которую загружается класс "registry" (находится в /system/engine/registry.phpесли вы заинтересованы в том, чтобы выделить это - это очень упрощенно).

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

public function __construct($registry) {
    $this->registry = $registry;
}

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

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

Так $this->cartв любом контроллере попытается получить объект с ключом cartиз реестра. Если вы посмотрите на index.phpфайл вы увидите, что это выделено там

// Cart
$registry->set('cart', new Cart($registry));
https://stackoverflow.com/questions/22809285/how-does-opencart-access-its-library-classes/22810371#comment34794655_22810371
Спасибо, функция __get()была недостающим звеном, ваш пост хорошо объясняет это
Gengjun Wu

19.04.2016 06:57:52

Как упоминал Джей Гилфорд, вам нужно зарегистрировать свой новый файл класса библиотеки в индексе.php и / или admin / index.php (в зависимости от того, используете ли вы его в catalog или admin)

$registry->set('yourlibraryclass', new YourLibraryClass());

таким образом, При загрузке системы Opencart знает, что ваш класс существует, тогда вы можете вызвать все его функции с помощью:

$this->yourlibraryfilename->function();

Обратите внимание, что имя файла библиотеки обычно совпадает с именем класса, поэтому оно используется в приведенном здесь примере.

После внесения изменений в индекс.php файлы, вам нужно выйти из системы и войти снова, чтобы увидеть изменения.

Закрыть X