作者自写PHP基于MVC分层的类及使用规则(包含伪静态重写)

通过清心醉

作者自写PHP基于MVC分层的类及使用规则(包含伪静态重写)

首先要献上的就是MVC的类::

class mvc
{
/*
* 控制器开始
*/
public function controller()
{
$config=’config/config.php’; #配置文件
if (!file_exists($config))
{
if ((isset($_GET[‘controller’])&&!empty($_GET[‘controller’]))&&(isset($_GET[‘action’])&&!empty($_GET[‘action’])))
{
#第一次是引导到安装列表控制器,第二次是写入数据SQL的访问
}
else
{
echo “<script>setTimeout(\”this.location=’install/install.html’\”,0);</script>”;
#重新返回,这时候开始以控制器的方式进入
}
}
#在这里不用担心安装好后因为没有控制器和方法的GET数据,因为会有配置文件.所以该判断会不调用.
if(is_array($_GET)&&count($_GET)>0) #如果有GET传参
{
#获取要运行的controller和action
$controller=@$_GET[‘controller’];
$action=@$_GET[‘action’];
}
else
{
#默认调用index
$controller=”index”;
$action=”index”;
}
$controller_name=$controller.’Controller’; #获取控制器的类名
$controller_path=’controller/’.$controller_name.’.php’; #获取控制器文件位置
if (!file_exists($controller_path)) #判断控制器文件是否存在
{
echo “error1”;
#echo “<script>setTimeout(\”this.location=’404.php’\”,0);</script>”;
exit;
}
include_once ($controller_path); #把控制器文件包含进来
if(!$controller_class = new $controller_name())
{
#尝试实例化控制器类,如果实例化出错表示该控制器的类不存在,中止.
echo “error2”;
#echo “<script>setTimeout(\”this.location=’404.php’\”,0);</script>”;
exit;
}
#控制器检测完了接下来就是检测方法是否存在了.
$_COOKIE[“controller”]=$controller; #首先cookie记录控制器的值
if (!method_exists($controller_name,$action))
{
$action=’index’; #不存在重新赋值为index
}
$_COOKIE[“action”]=$action;
$controller_class->$action(); #调用控制器的方法.
}

/*
* 模板开始
*/

protected $model_type; #模板类型.
protected $pdo; #PDO连接

protected function model_config()
{
if ($_COOKIE[“controller”]==’install’) #判断控制器是否为install安装程序
{
$config=’config/config.php’; #配置文件
if (file_exists($config)) #如果配置文件存在,中止.将不会把模板给包含进去
{
exit;
}
}
else
{
$config=’config/config.php’; #配置文件
if (file_exists($config))
{
include_once ‘/config/config.php’; #包含配置文件
include_once ‘header.php’; #包含头部文件
$mysql_pdo=$GLOBALS[“pdo”]; #获取全局PDO变量值
return $this->pdo=$mysql_pdo; #赋值给PDO成员变量
}
else
{
echo “<script>setTimeout(\”this.location=’404.php’\”,0);</script>”;exit;
}
}

}
protected function model($model_action) #判断模板的方法
{
$this->model_config();
$model_path=’model/’.$_COOKIE[“controller”].’Model.php’;
#配置模板目录 目录格式为:: model/控制器Model.php
include_once($model_path); #包含模板目录

if (empty($model_action)) #如果方法为空的
{
$model_action=$_COOKIE[“controller”]; #调用和控制方法名相同的
#这样就不需要多个模板来写了.
$model_name=$_COOKIE[“controller”].’Model’;
#模板要使用的方法如果为空,用控制器方法做模板类名称
}
else
{
$model_name=$_COOKIE[“controller”].’Model’;
#如果模型有传递方法,使用模板的名称为模型类名称.
}
$this->model_type=new $model_name; #实例化模板
return $this->model_type->$model_action();
#返回调用实例化后的模板的参数($model_action)方法
#因为前面没考虑到模板内会有多个方法,前面的就暂时带个NULL值吧.文件先不改了.
}

/*
* 视图开始
*/

protected function view($view) #需要调用的当前视图
{
$view_path=’view/’.$_COOKIE[“controller”].’/’.$view.’.php’; #确认视图文件位置
include_once($view_path); #包含视图目文件
}
}

然后我们看看 各个层次的结构::

1

注:至于view层次,由于每个控制器的方法,可能会输出不同的数据,所以目录会多一级

如果我们需要写一个控制器,命名方法为:名字Controller 文件名相同

require_once ‘class/mvc.php’;

class indexController extends system
{
function index()
{
$this->model(‘index’); #因为继承的关系,在MVC类已经有实现包含所以可以直接$this调用
}
}

模板和控制器一样:

class indexModel extends system
{
function index()
{
$this->view(‘index’); #直接调用视图,如果有对SQL进行处理返回显示,根据不同的结果调用不同的视图
}
}

至于视图的层,就直接可以写了。当然如果你在控制器/模板内有需要显示的,也可以直接echo $this->来调用

 

以下为.htaccess伪静态及404跳转规则:

RewriteEngine On
RewriteRule ([a-zA-Z]{1,})/([a-zA-Z]{1,})\.html$ index.php?controller=$1&action=$2
RewriteRule ([a-zA-Z]{1,})/([a-zA-Z]{1,})-([0-9]{1,})\.html$ index.php?controller=$1&action=$2&id=$3
#ErrorDocument 404 /404.php

 

* 目录说明::
* class->类文件
* controller->所有控制器
* model->所有模板
* view->所有视图
* style->样式及JS (后期开发前端时,配合view视图进行前端开发即可.将不需要修改其他文件夹内的文件.)
* imaget->图片
* config->配置文件目录.
* 全站将对每级目录进行.htaccess,以防止跨文件访问.
*
* .htaccess文件说明:
* RewriteRule ([a-zA-Z]{1,})/([a-zA-Z]{1,})\.html$ index.php?controller=$1&action=$2
* RewriteRule ([a-zA-Z]{1,})/([a-zA-Z]{1,})-([0-9]{1,})\.html$ index.php?controller=$1&action=$2&id=$3
* 伪静态的正则表达式
* 使用方法:
* 1: http://127.0.0.1/user/login.html
* 2: http://127.0.0.1/fenlei/wenzhang-1.html
* 第一个访问的是控制器,第二个访问的是方法;
* 如第二条规则多了一个ID,可以用于访问指定的文章.
* ErrorDocument 404 /404.php
* 如果访问的控制器等不存在出现404错误返回的404页面.
*
* 至于文件包含,只需要在控制器包含并且继承某文件的类,在默板视图就可以直接使用.
* 如果文件没有经过模板就进行输出,头部文件不给予包含在内.

关于作者

清心醉 administrator

发表评论

如果喜欢作者的文章,您可以打赏给作者:

TRC20(虚拟货币):


ERC20(虚拟货币):


Bitcoin(BTC):