php mvc完美目录结构,MVC目录架构

摘要:通过本章的学习,了解了MVC架构的原理,当客户端请求数据时,先通过controller控制器判断是哪种请求类型,再像model请求分发,model通过业务逻辑的处理,把数据返还给controller,controller再通过判断是需要显示到哪个页面,把数据发送给对应view,通过view把数据显示到用户的界面中。本章还学习搭建了MVC基础框架,项目结构如下:本次框架主要包含三大目录及其他文件:基

通过本章的学习,了解了MVC架构的原理,当客户端请求数据时,先通过controller控制器判断是哪种请求类型,再像model请求分发,model通过业务逻辑的处理,把数据返还给controller,controller再通过判断是需要显示到哪个页面,把数据发送给对应view,通过view把数据显示到用户的界面中。

本章还学习搭建了MVC基础框架,项目结构如下:

3093d30719ebde8562a3737ee4437b79.png

本次框架主要包含三大目录及其他文件:基类目录。该目录命名为pong。pong目录下面包含core目录、基类文件、配置文件、路由文件,其中,core目录包含了controller、view、model三个基类。

自己的应用项目。项目放在app目录下,app目录下设admin目录、home目录、Model目录,admin目录主要用于存放后台管理页面的数据,里面包含controller和view两个文件夹,分别存放具体页面对应的控制器文件和视图文件。home目录与admin目录的架构类型类似,主要用于存放前台的文件。Model目录,主要用于存放系统公用的model类,因为model类是可以给前台和后台公用,所以独立到一个文件夹中。

模板框架目录。该目录主要是通过composer下载的模板框架和数据库框架。

.htaccess文件。该文件主要用于页面的重定向。

composer.json和composer.lock文件。这两个文件主要是通过composer获取框架后自动生成的文件,其中composer.lock存放了框架的基础配置,如框架版本。

Index.php文件。该文件为入口文件,通过.htaccess文件配置的重定向,默认访问域名时,即进入该文件。

框架源码:

入口文件index.php<?php

/**

* 入口文件

*/

//导入模板框架

require __DIR__.'/vendor/autoload.php';

//导入基础类

require  __DIR__.'/pong/Base.php';

//获取配置文件信息

$config=require __DIR__.'/pong/Config.php';

//定义根目录路径

define('ROOT_PATH',__DIR__.'/');

//获取查询字符串

$queryStr=$_SERVER["QUERY_STRING"];

//启动框架

(new \pong\Base($config,$queryStr))->run();

基础类Base.php:<?php

/**

* 基类

*/

namespace pong;

class Base

{

//配置数组

protected  $config=[];

//查询字符串

protected  $queryStr=[];

public  function  __construct($config,$queryStr='')

{

$this->config=$config;

$this->queryStr=$queryStr;

}

//设置调试状态

public function setDebug()

{

//如果调试模式为true,则开启调试模式,否则关闭调试模式

if ($this->config['app']['debug']) {

error_reporting(E_ALL);

ini_set('display_errors','On');

} else {

ini_set('display_errors','Off');

ini_set('log_errors', 'On');

}

}

//设置自动加载器

public  function  loader($class)

{

//把参数格式进行转换

$path = ROOT_PATH . str_replace('\\','/',$class) . '.php';

//判断文件是否存在

if(!file_exists($path))

{

header('Location:/');//返回根目录

}

//加载文件

require_once $path;

}

//启动框架

public  function  run()

{

//设置调试模式

$this->setDebug();

//自动加载

spl_autoload_register([$this,'loader']);

//请求分发

$route=new Route($this->config['route']);

echo $route->parse($this->queryStr)->dispatch();

}

}

配置基类config.php<?php

/**

* 配置文件

*/

return [

//应用配置

'app'=>[

//调试开关

'debug'=>true

],

//路由配置

'route'=>[

//默认模块

'module'=>'admin',

//默认控制器

'controller'=>'Index',

//默认操作

'action'=>'index'

],

'db'=>[

// 数据库类型

'database_type' => 'mysql',

// 默认数据库名称

'database_name' => 'frame',

// 默认主机名

'server' => 'localhost',

// 默认用户名

'username' => 'root',

// 用户密码

'password' => 'root',

// 编码

'charset' => 'utf8',

//端口

'port' => 3306,

]

];

路由基类Route.php:<?php

/**路由类*/

namespace pong;

class Route

{

protected $route=[];

protected $passInfo=[];

protected $params=[];

public function __construct($route)

{

$this->route=$route;

}

/**

* @param string $queryStr  链接参数

* @return $this            当前类的实例

*/

public  function  parse($queryStr='')

{

//去除字符串左右的/,并将参数全部转为小写

$queryStr=strtolower(trim($queryStr,'/'));

//通过/把字符串转成数组

$queryArr=explode('/',$queryStr);

//数组过滤掉空字符

$queryArr=array_filter($queryArr,function($value){

return trim($value)!='';

},ARRAY_FILTER_USE_BOTH);

//判断数组中有几个参数

switch (count($queryArr))

{

case 0:

$this->passInfo = $this->route;

break;

case 1:

$this->passInfo['module']=$queryArr[0];

break;

case 2:

$this->passInfo['module']=$queryArr[0];

$this->passInfo['controller']=$queryArr[1];

break;

case 3:

$this->passInfo['module']=$queryArr[0];

$this->passInfo['controller']=$queryArr[1];

$this->passInfo['action']=$queryArr[2];

break;

default:

$this->passInfo['module']=$queryArr[0];

$this->passInfo['controller']=$queryArr[1];

$this->passInfo['action']=$queryArr[2];

//从第四个元素开始遍历,即过滤掉路由的信息

for($i=3;$i

{

if(isset($queryArr[$i+1]))

{

$this->params[$queryArr[$i]]=$queryArr[$i+1];

}

}

break;

}

//返回当前对象

return $this;

}

public function  dispatch()

{

//模块名

$module = $this->passInfo['module'];

//控制器名

$controller='\app\\' .$module . '\controller\\' .  ucfirst($this->passInfo['controller']) ;

//操作

$action= $this->passInfo['action'];

//如果找不到,重新返回根目录

if(!method_exists($controller,$action))

{

header('location:/');

}

return call_user_func_array([new $controller,$action],$this->params);

}

}

控制器基类Controller.php<?php

/**控制器基类*/

namespace pong\core;

class Controller

{

protected  $view=null;

public  function  __construct()

{

$this->view=new namespace\View();

$this->config();

}

//配置方法

public  function  config()

{

//设置后台模板目录的命名空间

$this->view->addFolder('admin', ROOT_PATH.'/app/admin/view');

//设置后台模板目录的命名空间

$this->view->addFolder('home', ROOT_PATH.'/app/home/view');

}

}

视图基类view.php<?php

/*视图基类**/

namespace pong\core;

use League\Plates\Engine;

class View extends  Engine

{

public  function __construct($directory = null, $fileExtension = 'php')

{

parent::__construct($directory, $fileExtension);

}

}

模型基类Controller.php<?php

/**模型基类*/

namespace pong\core;

use Medoo\Medoo;

class Model extends Medoo

{

public function  __construct($option=null)

{

$config=require __DIR__.'../Config.php';

$option=$config['db'];

parent::__construct($option);

}

}

批改老师:韦小宝批改时间:2019-01-25 17:43:20

老师总结:写的很完整 不错不错 mvc是大部分PHP框架都在用的一种架构 简单 方面操作 易懂

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值