古城热线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
开启左侧

OpenCart: 架构概览

[复制链接]
发表于 2015-5-13 11:19:39 | 显示全部楼层 |阅读模式
OpenCart是一个代码设计精致小巧的电子商务系统。

1、MVC架构:

OpenCart是基于MVC范式的。

model层负责获取数据。和其他一些框架如CakePHP相比,model的功能实现有限但简洁,直接调用DB类实现数据CRUD操作。

(CakePHP的模型层支持基础数据验证,复杂业务逻辑由Controller层处理)。

controller层负责处理请求,从model获取数据,提交给view层模板。

view负责组织展示。



2、“Registry”设计模式

在OP中,Registry是整个系统的信息中枢。

Registry是一个单例(Singleton),在index.php起始页面中,

首先作为构造函数参数传递给所要用到的类创建类实例,并随之将这个类实例设置到这个“注册表”中,

这个注册表就像是一个共享的数据总线一样,把各个模块/数据串联在一起。


// Registry



$registry = new Registry();


// Front Controller


$controller = new Front($registry);


3、整体流程

(1)创建Registry对象

(2)注册所有公共类

(3)创建Front类对象,作为请求分发器(Dispatcher)

(4)根据用户请求(url)创建控制器对象及其动作。

            在Front类私有函数execute($action)中如下语句


            $controller = new $class($this->registry); //创建控制器


(5)控制器加载相应的模型,如

        $this->load->model('design/layout');(注意前后的模型,/ 线前面是模型下的文件目录名后面是目录下的文件名,也是模型对象)


        该语句将创建相应的model对象。(相当NEW对像,加载进模型后就可以使用了,一般处理复杂程序或需要重用时就会建模型,每个模型是一个类)


如:
$this->load->model('user/user');//加载后模型类名$this->文件目录->文件名(文件目录是指model下的目录名)

$this->model_user_user->getTotalUsersByEmail($this->request->post['email'])




(6)控制器获取模板,绘制(提取数据并启用output buffer)到页面输出区output中


                $this->render();





(7)最后Response对象把输出区的数据(页面)echo返回给用户




如:if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/product.tpl')) {


$this->template = $this->config->get('config_template') . '/template/product/product.tpl';


} else {


$this->template = 'default/template/product/product.tpl';


}

$this->children = array(


'common/column_left',

'common/column_right',

'common/content_top',

'common/content_bottom',

'common/footer',

'common/header'

);

$this->response->setOutput($this->render());



4、魔术函数(Magic method)


在Controller中调用$this->load->...时,熟悉面向对象语言的开发人员会觉得有点奇怪,因为Controller基类中并没有$load成员变量。

实际上这是由PHP5魔术函数来实现的。__get(), __set()函数在获取/设置非类定义成员变量的时候,会由PHP自动调用。


那么OP中在执行$this->load->...时实际调用的是:

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


现在体会到Registry‘共享总线’的作用了吧。







MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离




数据模型包括数据库数据的结构部分、数据库数据的操作部分和数据库数据的约束条件。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|古城热线论坛 ( 宁ICP备12000722号 )

GMT+8, 2024-5-3 21:14 , Processed in 0.072879 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表