PHP程序员小白到大牛集训(12期免息)

MVC目录架构

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

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

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

QQ截图20190125160312.jpg

本次框架主要包含三大目录及其他文件:

  1. 基类目录。该目录命名为pong。pong目录下面包含core目录、基类文件、配置文件、路由文件,其中,core目录包含了controller、view、model三个基类。

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

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

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

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

  6. 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<count($queryArr);$i+=2)
                {
                    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框架都在用的一种架构 简单 方面操作 易懂

发布手记

热门词条