ShopSuite
基于自研的MVC`
(Model-View-Controller)`框架的基础上开发,下面的一些概念有必要做下了解,可能在后面的内容中经常会被提及。
入口文件
用户请求的PHP
文件,负责处理请求(注意,不一定是HTTP请求)的生命周期,入口文件位于www
目录下面,最常见的入口文件就是index.php
,ShopSuite
采用了多应用多入口,你可以给每个应用增加入口文件,例如给后台应用单独设置的一个入口文件admin.php
。
应用
每个应用是一个app目录的子目录(或者指定的composer库),每个应用具有独立的路由、配置,以及MVC相关文件,这些应用可以公用框架核心以及扩展。而且可以支持composer应用加载。
路由
路由是用于规划(一般同时也会进行简化)请求的访问地址,在访问地址和实际操作方法之间建立一个路由规则 => 路由地址的映射关系。
ShopSuite
强制使用路由,路由的核心作用是规范URL,还可以实现验证、权限、参数绑定及响应设置等功能。
控制器
每个应用下面拥有独立的类库及配置文件,一个应用下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。
控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。严格来说,控制器不应该过多的介入业务逻辑处理。
ShopSuite
的控制器类需继承基础类库Zero_AppController
。
一个典型的Index控制器类如下:
<?php if (!defined('ROOT_PATH')) exit('No Permission');
/**
* @author Xinze <xinze@live.cn>
*/
class IndexCtl extends Zero_AppController
{
/**
* 商城首页
*
* @access public
*/
public function index()
{
$data = array();
$this->render('default', $data);
}
}
操作
一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元。
下面是一个典型的Index控制器的操作方法定义,包含了两个操作方法:
<?php if (!defined('ROOT_PATH')) exit('No Permission');
/**
* @author Xinze <xinze@live.cn>
*/
class IndexCtl extends Zero_AppController
{
/**
* 商城首页
*
* @access public
*/
public function index()
{
$data = array();
$this->render('default', $data);
}
public function hello(string $name)
{
$data = ['Hello,'.$name];
$this->render('default', $data);
}
}
操作方法可以不使用任何参数,如果定义了一个非可选参数,并且不是对象类型,则该参数必须通过用户请求传入,如果是URL请求,则通常是通过当前的请求传入,操作方法的参数支持依赖注入。
模型
模型类通常完成实际的业务逻辑和数据封装,并返回和格式无关的数据。
模型类并不一定要访问数据库,而且在
ShopSuite
的架构设计中,只有进行实际的数据库查询操作的时候,才会进行数据库的连接,是真正的惰性连接。
ShopSuite
的模型层支持多层设计,你可以对模型层进行更细化的设计和分工,例如把模型层分为逻辑层/服务层/事件层等等。
模型类通常需要继承Zero\Model类,一个典型的User模型器类如下:
<?php
class UserModel extends Zero_Model
{
}
视图
控制器调用模型类后,返回的数据通过视图组装成不同格式的输出。视图根据不同的需求,来决定调用模板引擎进行内容解析后输出还是直接输出。
视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模板目录。
模板引擎
PHP本身就是做好的模板引擎
驱动
系统很多的组件都采用驱动式设计,从而可以更灵活的扩展,驱动类的位置默认是放入核心类库目录下面,也可以重新定义驱动类库的命名空间而改变驱动的文件位置。
中间件
中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。
新版部分核心功能使用中间件处理,你可以灵活关闭。包括请求缓存和多语言功能。
事件
在应用中使用事件机制的特性来扩展功能。