用composer搭建php框架(三)--MVC之控制器

本教程示例代码见 github:https://github.com/xdlmr/myframe

前言

上一篇中我们已经使用klein构建了一个简单的路由,当我们路由跑起来时候,我们的工作就简单多了,接下来将会设计一个mvc框架,使得更丰满、有活力!

MVC

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

  1. Model(模型)表示应用程序核心(比如数据库记录列表)。
  2. View(视图)显示数据(数据库记录)。
  3. Controller(控制器)处理输入(写入数据库记录)。

MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
(来自百度百科);

配置文件

我们先建一个配置文件,常用变量都在里面哦!
新建文件夹phpframe/config,添加文件config.php:

<?php

define("DEBUG", true);//调试模式

// 数据库地址
define('DRIVER', 'pgsql');
define('DB_TYPE', 'pgsql');
define('DB_IP', '127.0.0.1');
define('DB_PORT', '5432');
define('DB_USERNAME', 'postgres');
define('DB_PASSWORD', '123456');
define('DB_NAME', 'phpframe');

//views 层目录
define('PRODUCT_TEMPLATE_DIR', WEB_ROOT . "/" . 'views');

//相应状态
define('CODE_SUCCESS', 200);
define('CODE_ERROR', 300);

这里我已经预先定义一些后期需要用到的变量
在index.php合适位置添加代码:

require_once WEB_ROOT . '/config/config.php';//配置文件
//开启调试
if(DEBUG) {
    ini_set('display_errors', 'On');
} else {
    ini_set('display_errors', 'Off');
}

加载指定类型的类程序

这标题有点绕,解释下:就是按需加载我们需要引入的类文件,比如加载控制器的controller文件以及模型的model文件。
新建文件phpframe/common/box.php:

<?php

/**
 * 加载指定类型的类程序
 **/
class Box {
    public static $_modelObjArr;

    public static function getObject($_appName, $_typeStr = 'controller', $product = '') {
        // var_dump($_typeStr.'----');
        // $_typeStr = ( $_typeStr === '' )?'controller':$_typeStr;
        $_appName = strtolower($_appName);
        $_typeStr = strtolower($_typeStr);

        $className = $_appName . ucfirst($_typeStr);

        if(isset(self ::$_modelObjArr[$className]) && is_object(self ::$_modelObjArr[$className])) {
            return self ::$_modelObjArr[$className];
        }
        $appdir = ( $product === '' ) ? PRODUCT : $product;

        $file = WEB_ROOT . "/app/${_typeStr}/" . $appdir . "/${_appName}.${_typeStr}.php";
        if(file_exists($file)) {

            include_once $file;
            // var_dump($file);
            if(class_exists($className)) {
                return self ::_createObject($className);

            }
        }
        return null;
    }

    public static function controller($appname, $product) {
        return self ::getObject($appname, 'controller', $product);
    }

    public static function model($appname, $product) {
        return self ::getObject($appname, 'model', $product);
    }

    public static function _createObject($_className) {
        // var_dump($_className);
      if(isset(self ::$_modelObjArr[$_className]) && is_object(self ::$_modelObjArr[$_className])) {
            return self ::$_modelObjArr[$_className];
        } else {
            self ::$_modelObjArr[$_className] = new $_className();
            // var_dump(self::$_modelObjArr);
            return self ::$_modelObjArr[$_className];
        }
    }

    //错误提示
    public static function _showErr($_errTypeStr = '') {
        echo $_errTypeStr;
        exit;
        //errorlog($_errTypeStr);
    }
}//end class
?>

在composer.json 加入autoload,如下图:
这里写图片描述

执行composer dump-autoload自动加载box.php。

添加控制器

添加控制器

新建 phpframe/app 文件夹,在 app 中创建 controller、model、views 三个文件夹,controller下新建index.controller.php:

<?php
    class IndexController extends Controller {
        public function render() {
            echo "<h1>控制器成功</h1>";
        }
        public function dologin($req){
          return ['code' => CODE_SUCCESS, 'msg' => "方法路由成功"];
        } 
    }

controller下新建controller.php:

<?php
    class Controller {
    }

composer.json加入:”app/controller/controller.php” 。

刷新页面,看到:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fontstyle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值