zoukankan      html  css  js  c++  java
  • 制作自己的MVC框架(一)——简单粗暴的实现

    现在市面上有很多成熟的MVC框架,可以拿来直接用,但自己造一下轮子其实也挺有意思的。

    下面先来看个最简单粗暴的MVC实现。

    5个文件就能实现最简单的MVC,在Apache中设置一个虚拟目录,配置个简单域名,就可以顺利访问了。

    为了实现简单,这里没有写模型层。

    一、index.php

    这个文件是入口文件,所有的请求就将会先进入到这个文件,然后再通过路由进入到不同的控制器中。

    这就是常说的单一入口

    1. 我简单的将路由也放在了这个文件中。

    2. 还将一个简单的全局常量放在了这里。

    define('APP_PATH', dirname(__FILE__));
    
    //路由逻辑
    if(empty($_GET['c'])) {
        $uri = ltrim($_SERVER['REQUEST_URI'],'/');
        $params = explode('/',$uri);//简单粗暴的将URL分割,例如index/action
        $controller = $params[0];//第一个变量是控制器名
        $action = $params[1];//第二个是方法名
    }else {
        $controller = $_GET['c'];//第二种域名访问方式 "pwstrick.com?c=index&a=action"
        $action = $_GET['a'];
    }

    3. 再是引入试图的生成类和控制器类

    4. 最终初始化这个控制器,就能实现访问了。

    //初始化逻辑
    require_once './view.php';//试图控制类
    require_once APP_PATH . '/controller/'.$controller.'.php';//需要访问的控制器,例如index控制器
    $handler = new $controller;//初始化这个控制器,例如index
    $handler->$action();//执行方法,也就是最终访问的那个地方

    这样就完成了一次简单的访问,下图就是输入了一个简单URL,展示了view中的内容。

    二、.htaccess

    .htaccess”是做路由用的,因为我用的服务器软件是Apache,所以需要,如果是Nginx就不需要。

    这里将URL中的“index.php”干掉了,不然访问就需要多打这个,例如“index.php?c=index&a=action”。

    这些参数具体的用法,可以上网自己查一下的。

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [L]

    三、视图

    市面上有很多模版引擎,很多都需要些学习成本。这里我用了PHP自带的Output Control相关函数。

    下面的代码是“view.php”中的方法。

    public function fetch($template, array $data = []) {
            $data = array_merge($this->attributes, $data);
            ob_start();
            extract($data);//设置view上面的参数
            include $this->templatePath . $template;//引入试图文件的绝对路径
            $output = ob_get_clean();//输出页面
            return $output;
    }

    下面的代码是“view/index.php”中的代码,就仅仅是输出一个变量“$send”而已。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>badge</title>
    </head>
    <body>
        <strong><?php echo $send?></strong>
    </body>
    </html>

    四、控制器

    控制器在入口文件“index.php”中初始化了一下,并且也引用了一下指定的方法。

    里面也没有使用到什么高大上的方法,就是在执行生成view的代码。

    //一般都会继承一个通用的controller父类
    class index {
        function action() {
            $view = new view(APP_PATH . '/view/');//初始化视图控制类
            $output = $view->fetch( 'index.php',array('send' => '发送'));//指定要输出的视图名,并设置变量
            echo $output;
        }
    }

    这样就实现了一次简单MVC。

    接下来会具体的做些逻辑的分层,添加一些通用的功能,路由,引入数据操作,配置文件等。

    demo下载:

    https://github.com/pwstrick/framework_demo

  • 相关阅读:
    UVA 10970 Big Chocolate
    HBuilder 安装uviewui2.0
    域名访问配置支持ipv6
    SSIS学习视频(SQL Server 2008)
    碰到MySQL无法启动1067错误问题
    对存储过程进行加密和解密(SQL 2008/SQL 2012)
    脚本文件比较工具WinMerge
    通过SQL绘制杨辉三角
    通用分页存储过程(SQL Server 2005)
    重新组织和重新生成索引sp_RefreshIndex
  • 原文地址:https://www.cnblogs.com/strick/p/5767906.html
Copyright © 2011-2022 走看看