标签:
就我上次提到的 基于MVC设计模式实现简单PHP框架(雏形)-初期 这次列出我实现的LabPHP简易框架,该框架中没有使用任何的模板引擎,所以说要在模板中使用到php变量的话,仍然需要用到php的标签和语法,输出显示变量。但是却大体实现了逻辑与界面的分离。
该框架的简单同时也因此存在的许多的局限性,如目录结构不能轻易修改,当然除非修改框架内容,介于时间关系我也没有做过多的修改。
LabPHP框架的目录结构如下:
项目的目录结构如下:
入口文件为 index.php
URL模式为:
http://serverName/index.php?m=模块名/c=控制器名/a=操作名
默认模块为Home,默认控制器为Index,默认操作为index。如果需要访问非默认,需要传入参数。
在Application文件夹可以有多个模块,这里只是列出了两个模块Home模块和Admin模块,默认模块为Home模块,也因为是默认模块,所以在访问非默认模块的情况下,需要在url中传入参数,如 index.php?m=Admin,表明是访问Admin模块的内容。
当然我们可以添加更多的模块,需要注意的时,模块下的文件夹需要跟上图一致。其中Config.php文件内容为配置文件,Controller文件夹放置自定义的控制器,Model文件夹放置自定义的模型,View文件夹放置模板,其中View文件夹下先创建名为控制器名的文件夹,下面再放置模板。
访问默认模块Home,入口文件index.php,结果如下:
访问Admin模块,结果如下:
LabPHP框架的函数库,如下:
LabPHP/Common/functions.php
<?php //防止非法字符的输入 function daddslashes($str) { return (!get_magic_quotes_gpc())?addslashes($str):$str; } /** * 获得当前被访问的模块名 * @return [type] 当前模块名 */ function getModuleName() { return isset($_GET['m']) ? daddslashes($_GET['m']) : 'Home'; //初始化模块(默认Home模块) } /** * 获得当前被访问的控制器名 * @return [type] 当前控制器名 */ function getControllerName() { return isset($_GET['c']) ? daddslashes($_GET['c']) : 'Index'; //初始化控制器 } /** * 获得当前被访问的操作名 * @return [type] 当前操作名 */ function getActionName() { return isset($_GET['a']) ? daddslashes($_GET['a']) : 'index'; //初始化操作 } function getConfig() { $c1 = include('./LabPHP/Conf/convention.php'); $c2 = include('./Application/' . MODULE_NAME . '/Config/config.php'); $config = array_merge($c1, $c2); return $config; } /** * 用于调用 $name 控制器的 $method 方法 * @param [type] $name 控制器名 * @param [type] $method 方法名 */ function C($name, $method) { $m = getModuleName(); require_once('./Application/' . $m . '/Controller/' . $name . 'Controller.class.php'); $c = $name . 'Controller'; $ct = new $c(); $ct->$method(); } /** * 返回对应的Model对象 * @param [type] $name Model类的名 */ function M($name) { $m = getModuleName(); require_once('./Application/' . $m . '/Model/' . $name . 'Model.class.php'); $model = $name.'Model'; $obj = new $model(); return $obj; } ?>LabPHP/Conf/convention.php
<?php return array( /* 数据库设置 */ 'DB_HOST' => '', // 服务器地址 'DB_NAME' => '', // 数据库名 'DB_USER' => '', // 用户名 'DB_PWD' => '', // 密码 'DB_PORT' => '', // 端口 /* 模板设置 */ 'TMPL_TEMPLATE_SUFFIX' => '.html', // 默认模板文件后缀 ); ?>LapPHP/Conf/include.list.php
<?php //定义需要提前引入的文件 $paths = array( 'Common/functions.php', //函数库 'Libs/LabPHP.class.php', //启动引擎 'Libs/Controller/Controller.class.php', //基本控制器类 'Libs/Model/SqlHelper.class.php', //数据库操作类 'Libs/Model/Model.class.php', //基本模型类 ); ?>LabPHP/Libs/Controller/Controller.class.php
<?php //基本控制器类 Controller.class.php class Controller { private static $tplPath = './Application/' . MODULE_NAME . '/View/'; //模板放置的路径 private static $config; //用户配置+默认配置 private static $tmpl_suffix; //模板的后缀名 private $data = array(); //保存注册到模板上的变量 /** * 获取配置信息(用户配置+默认配置)、模板后缀名 */ function __construct() { self::$config = getConfig(); self::$tmpl_suffix = self::$config['TMPL_TEMPLATE_SUFFIX']; } /** * 验证变量是否存在,是否为空 * @param [type] $v [需要进行验证的变量] * @return [type] [true | false] */ function validate($v) { if(!isset($v) || empty($v)) return false; return true; } /** * 重定向 * @param [type] $url [重定向的URL地址,格式为 控制器名/方法名 ] * @param string $arg [重定向需要传递的参数] * @return [type] [description] */ function redirect($url, $arg = '') { $args = array(); $args['m'] = MODULE_NAME != 'Home' ? 'm=' . MODULE_NAME : ''; //当前模块 $arr = split('/', $url); $args['c'] = $arr[0] != 'Index' ? 'c=' . $arr[0] : ''; //控制器名 $args['a'] = $arr[1] != 'index' ? 'a=' . $arr[1] : ''; //方法名 $args['arg'] = $arg; $to = 'Location: index.php'; $isFirst = true; foreach ($args as $key => $value) { if(!empty($value)) { if($isFirst) { $to .= '?' . $value; $isFirst = false; } else { $to .= '&' . $value; } } } header($to); exit; } /** * 注册模板上的变量 * @param [type] $key [应用在模板上的变量名] * @param [type] $value [变量对应的值] * @return [type] [当前对象的引用,提供链式写法] */ function assign($key, $value) { $this->data[$key] = $value; return $this; } /** * 显示page模板 * @param [type] $page [模板的名称:控制器名/方法名(View文件夹下的 以控制器名为文件夹下 的 以方法名为文件名的模板)] * @return [type] [description] */ function display($page = CONTROLLER_NAME . '/' . ACTION_NAME) { if($this->validate($this->data)) { extract($this->data); } include_once(self::$tplPath . $page . self::$tmpl_suffix); //销毁注册过的变量 if($this->validate($this->data)) { foreach ($this->data as $key => $value) { unset($$key); } $this->data = array(); } exit; } } ?>LabPHP/Libs/Model/Model.class.php
<?php //基本模型类 Model.class.php class Model { private $sqlHelper; function __construct() { $this->sqlHelper = new SqlHelper(); } /** * 验证变量是否存在,是否为空 * @param [type] $v [需要进行验证的变量] * @return [type] [true | false] */ function validate($v) { if(!isset($v) || empty($v)) return false; return true; } /** * 执行DQL语句(select语句) * @param [type] $sql SQL语句 * @return [type] 结果集 */ function execute_dql_res($sql) { return $this->sqlHelper->execute_dql_res($sql); } /** * 执行DQL语句(select语句) * @param [type] $sql SQL语句 * @return [type] 以关联数组的形式返回 */ function execute_dql_arr($sql) { return $this->sqlHelper->execute_dql_arr($sql); } /** * 执行DML语句(insert、update、delete语句) * @param [type] $sql SQL语句 * @return [type] 0表示失败;1表示成功;2表示没有行受影响 */ function execute_dml($sql) { return $this->sqlHelper->execute_dml($sql); } } ?>LabPHP/Libs/Model/SqlHelper.class.php
<?php //数据库操作类 SqlHelper.class.php class SqlHelper { private $mysqli; private $host; //数据库主机名 private $user; //数据库用户名 private $pwd; //数据库密码 private $db; //数据库名 private $port; //端口号 public function __construct() { //完成初始化任务 if(defined('SAE_MYSQL_DB')) { //判断是否是云平台 $this->host = SAE_MYSQL_HOST_M; $this->user = SAE_MYSQL_USER; $this->pwd = SAE_MYSQL_PASS; $this->db = SAE_MYSQL_DB; $this->port = SAE_MYSQL_PORT; } else { $config = getConfig(); $this->host = $config['DB_HOST']; $this->user = $config['DB_USER']; $this->pwd = $config['DB_PWD']; $this->port = $config['DB_PORT']; $this->db = $config['DB_NAME']; } $this->mysqli = new MySQLi($this->host, $this->user, $this->pwd, $this->db, $this->port); if($this->mysqli->connect_error) { die('连接失败 ' . $this->mysqli->connect_error); } //设置访问数据库的字符集 //这句话的作用是保证php是以utf8的方式来操作我们的mysql数据库 $this->mysqli->query("SET NAMES utf8") or die($this->mysqli->error); } /** * 执行DQL语句(select语句) * @param [type] $sql SQL语句 * @return [type] 结果集 */ public function execute_dql_res($sql) { $res = $this->mysqli->query($sql) or die('操作dql失败' . $this->mysqli->error); return $res; } /** * 执行DQL语句(select语句) * @param [type] $sql SQL语句 * @return [type] 以关联数组的形式返回 */ public function execute_dql_arr($sql) { $arr = array(); $res = $this->mysqli->query($sql) or die('操作dql失败' . $this->mysqli->error); while($row = $res->fetch_assoc()) { $arr[] = $row; } $res->free_result(); return $arr; } /** * 执行DML语句(insert、update、delete语句) * @param [type] $sql SQL语句 * @return [type] 0表示失败;1表示成功;2表示没有行受影响 */ public function execute_dml($sql) { $res = $this->mysqli->query($sql)/* or die('操作dml失败' . $this->mysqli->error)*/; if(!$res) { return 0; //表示失败 } else { if($this->mysqli->affected_rows > 0) { return 1; //表示成功 } else { return 2; //表示没有行受到影响 } } } public function __destruct() { $this->mysqli->close(); } } ?>LabPHP/Libs/LabPHP.class.php
<?php class LabPHP { private static $m; //模块 private static $c; //控制器 private static $a; //操作 /** * 获取HTTP请求的参数-》 模块名、控制器名、操作方法名 * @return [type] [description] */ private static function init() { self::$m = isset($_GET['m']) ? daddslashes($_GET['m']) : 'Home'; //初始化模块 self::$c = isset($_GET['c']) ? daddslashes($_GET['c']) : 'Index'; //初始化控制器 self::$a = isset($_GET['a']) ? daddslashes($_GET['a']) : 'index'; //初始化操作 } /** * 根据控制器和方法名,创建对应的控制器,调用相应的方法 * @return [type] [description] */ public static function start() { self::init(); C(self::$c, self::$a); //C位于functions.php中,用于调用控制器$c的$a方法 } } ?>LabPHP/LabPHP.php
<?php //定义应用的模式——是否为调试模式 if(!defined('APP_DEBUG') || APP_DEBUG == false) { error_reporting(0); } //启动引擎 $currentdir = dirname(__FILE__); //首先include文件清单 include_once $currentdir . '/Conf/include.list.php'; //include必要的文件 foreach ($paths as $value) { include_once $currentdir . '/' . $value; } //定义当前被访问的模块 define('MODULE_NAME', getModuleName()); //定义当前被访问的控制器 define('CONTROLLER_NAME', getControllerName()); //定义当前被访问的操作 define('ACTION_NAME', getActionName()); LabPHP::start(); ?>
<?php return array( //'配置项'=>'配置值' /*'DB_HOST' => '', //设置主机 'DB_USER' => '', //设置用户名 'DB_PWD' => '', //设置密码 'DB_PORT' => '', //设置端口号 'DB_NAME' => '', //设置数据库名*/ /* 模板设置 */ /*'TMPL_TEMPLATE_SUFFIX' => '', // 默认模板文件后缀*/ ); ?>Application/Home/Controller/IndexController.class.php Application/Admin/Controller/IndexController.class.php
<?php class IndexController extends Controller { function index() { echo "<p style='width: 50%; height: 300px; line-height: 300px; padding: 10px 20px; font-family:\"微软雅黑\", \"Microsoft YaHei\"; font-size: 30px; margin: 50px auto; box-shadow: 0 0 3px #ABCDEF; text-align: center; position: relative;'>Hello LabPHP!<span style='line-height: 30px; font-size: 20px; position: absolute; bottom: 20px; right: 20px;'>欢迎使用LapPHP V1.0.0 By DreamBoy<span></p>"; } } ?>
index.php
<?php // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG', false); require_once './LabPHP/LabPHP.php'; ?>
标签:
原文地址:http://blog.csdn.net/qq_15096707/article/details/51227215