网站用的mvc模式,显示用smarty ,主要是因为网站分工比较细所以把前后台分开来做,这样就要用到模板以方便修改,多人协作开发就要用到规范的目录结构以便其他人可以读懂你的代码。
单入口:即index.php是唯一入口。任何请求均经过index.php,被路由到特定的类实例中的方法。
路由:实际上是通过应用根目录下的.htaccess、apache的rewrite模块,以及对请求字符串的分解而实现的(对请求字符串的分解,可能会得到请求对应的类、方法和参数),所以,runter架构中,.htaccess、apache rewrite和请求字符串的分解以及请求的命名规则就是最关键的线索。
MVC:即Models View Control
命名规则:在runt中,参数与controller中的类、方法,都相对应,而controller中会调用相应的model的类对象,也需要遵从相应的命名规则
目录结构
应用根目录
|-- Config 相关配置文件
|-- Controllers 页面请求的处理层
|-- Cron 后台Crontab定时执行的文件
|-- Docs 文档说明及对数据库修改记录
|-- Libs Router公用核心类定义
|-- Models 与Controllers相对应类的数据库操作类
|-- Plugin 相关插件功能
|-- tmp 临时数据
|-- views 模板类
|-- webroot 前台相关文件如:CSS、JS、IMG
|--.htaccess Apache Rewrite跳转规则
|-- index.php Route框架默认首页
一、 流程说明
1、Webroot/index.php执行,引入相关配置定义及类定义
2、调用STD::getParam函数获取当前URL
3、调用Roter->parseParams函数分析URL
4、调用Roter->loadController函数,根据Roter框架命名规则,引入 Controllers目录及Models目录下的对应名称文件
router.class.php:133 if(file_exists(_MODELS_PATH_.$this->params["controller"]."s.class.php")){ require_once _MODELS_PATH_.$this->params["controller"].'s.class.php'; } require_once _CONTROL_PATH_.$this->params["controller"].".php"; |
,实例化该控制类、模型类并初始化显示类
$className = ucfirst($this->params["controller"])."Controller"; $controller = new $className;
相应controller类的__construct()函数会实例化对应模型类并调用基类的initController() $className = $this->name."s"; $this->modelObj = new $className(); $this->initController();
Controller基类: public function initController() { global $user; $this->ViewEngine = new useSmarty(); $this->mUser = $user; $this->ViewEngine->assign("user",$user); } |
执行该类的指定Action,若未指定则默认调用该类的index方法
if (method_exists($controller,$this->params["action"])){ $controller->{$this->params["action"]}($this->params["pass"]); }else{ $controller->index(); } |
5、 执行相应处理,并调用相应显示模板,显示结果页
$this->ViewEngine->display( "primo.index.tpl" ); |
二、 Router核心类
1、router.class.php
本框架的核心类,主要完成URL的解析及相应控制、模型类的自动调用。说明:控制类及模型类需要按照Router命名规则。
Router命名规则:
(1) 用于实现逻辑控制的类需要存放在Controllers目录下,控制类的类名称由该类文件的文件名前缀(头字母要大写)加“Controller”组成,且派生与基类Controller。
例如:
控制类文件名:primo.php
控制类定义:class PrimoController extends Controller
(2) 用于实现与数据库交互的模型类需要存放在Models目录下,该模型类文件名称由对应控制类文件名前缀加“s.class.php”组成。该模型类的类名称由对应控制类文件名前缀加“s”组成,且派生与基类MySql。
例如:
模型类文件名:primos.class.php
模型类定义:class Primos extends MySql
基于Router框架的URL组成:
URL以“/”为分隔,第一部分为域名,第二部分为要调用的控制,第三部分为该控制的方法名,第四部分为该方法需要接收的参数。例如:
http:// g.ifensi.com / category / searchStar / hahaha
以俱乐部为例:进入俱乐部的论坛
http://cober.g.ifensi.com/forum/listThread/21
cober.g.ifensi.com 为域名
forum 为要调用的控制名,对应文件是/controllers/ category.php
listThread为要调用的方法,在category.php中有该函数的定义
21 为本方法的参数