了解opencart加载器

时间:2017-01-15 10:44:22

标签: php opencart classloader

查看opencart loader并尝试了解它是如何工作的。用于加载/调用文件的opencart加载器

<?php
final class Loader {
    private $registry;

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

    public function controller($route, $args = array()) {
        $action = new Action($route, $args);

        return $action->execute($this->registry);
    }

    public function model($model) {
        $file = DIR_APPLICATION . 'model/' . $model . '.php';
        $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $model);

        if (file_exists($file)) {
            include_once($file);

            $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry));
        } else {
            trigger_error('Error: Could not load model ' . $file . '!');
            exit();
        }
    }

    public function view($template, $data = array()) {
        $file = DIR_TEMPLATE . $template;

        if (file_exists($file)) {
            extract($data);

            ob_start();

            require($file);

            $output = ob_get_contents();

            ob_end_clean();

            return $output;
        } else {
            trigger_error('Error: Could not load template ' . $file . '!');
            exit();
        }
    }

    public function library($library) {
        $file = DIR_SYSTEM . 'library/' . $library . '.php';

        if (file_exists($file)) {
            include_once($file);
        } else {
            trigger_error('Error: Could not load library ' . $file . '!');
            exit();
        }
    }

    public function helper($helper) {
        $file = DIR_SYSTEM . 'helper/' . $helper . '.php';

        if (file_exists($file)) {
            include_once($file);
        } else {
            trigger_error('Error: Could not load helper ' . $file . '!');
            exit();
        }
    }

    public function config($config) {
        $this->registry->get('config')->load($config);
    }

    public function language($language) {
        return $this->registry->get('language')->load($language);
    }
}

这是我正在考虑的部分

public function model($model) {
$file = DIR_APPLICATION . 'model/' . $model . '.php';
$class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $model);

if (file_exists($file)) {
    include_once($file);

    $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry));
} else {
    trigger_error('Error: Could not load model ' . $file . '!');
    exit();
}
}

这是我从上面的代码中得到的。调用模型时(假设模型名称为ModelA),$ file设置为catalog / model / ModelA.php,$ class设置为ModelModelA然后检查文件($ file)是否存在以及是否包含它(include_once($ file))。

我不明白的是这部分$this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry));,我从中得到的是它试图注册模型文件名但是如何?

如果您看到OC的index.php,则会执行一些注册表,例如$registry->set('db', $db)。但是这个加载器注册表让我感到困惑,我只得到第一部分'model_' . str_replace('/', '_', $model)来转换&#39; ModelA&#39;到&#39; Model_ModelA&#39;但是这个new $class($this->registry)做了什么......新的Model_ModelA($ this-&gt;注册表)?

新的Model_ModelA($ this-&gt;注册表)中的$ this-&gt;注册表是什么?

1 个答案:

答案 0 :(得分:1)

好的,在花了一整天并浏览了几篇文章后,我发现并通过一些测试证实$this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry));实际上是在注册系统中注册模型

$registry->set(model_ModelA, new model_ModelA($this->registry))

非常像其他人在index.php上注册。