不足百行代码实现简易PHP-mvc框架

1.前言

mvc框架是大家最熟悉也是最经典的项目入门级的基础结构,平时用惯了成熟封装好的mvc框架,今天,我就来用最少的代码实现一个简易mvc框架供大家学习。

2.自动加载就是这样简单

框架的命名空间类之间的调用需要使用到自动加载技术,这里,我们以spl_autoload_register为例,下面是自动加载的核心代码。

<?php
/**
 * 作者: pitmanhuang
 * 创建时间: 2020/9/9 10:36
 * 邮箱: 1434414697@qq.com
 */
!defined('NAMESPACE_ROOT') && define('NAMESPACE_ROOT', 'Sea');
!defined('NAMESPACE_CONTROLLER') && define('NAMESPACE_CONTROLLER', NAMESPACE_ROOT . '\Controller');
!defined('NAMESPACE_VIEW') && define('NAMESPACE_VIEW', NAMESPACE_ROOT . '\View');

spl_autoload_register(function($class) {
    $root = substr($class, 0, 3);
    if ($root !== NAMESPACE_ROOT) {
        throw new Exception('类名根路径错误');
    }
    $path = realpath($class . '.php');
    if (file_exists($path)) {
        include_once $path;
    } else {
        throw new Exception('路径不存在:' . $path);
    }
});

当php需要创建类时,如果找不到可以实例化的类,则会通过spl_autoload_register注册的解析方式来动态创建类。这里我们就是使用这一技巧来动态创建类的。

2.MVC框架雏形

核心的mvc框架,需要使用request来贯穿全局,一条request能够在框架间流入流出,下面让我们看看核心的APP类的实现:

<?php
/**
 * 作者: pitmanhuang
 * 创建时间: 2020/9/9 11:37
 * 邮箱: 1434414697@qq.com
 */

namespace Sea;

class App
{
    public function __construct()
    {
    }

    public function run()
    {

        $filter = explode('/', $_SERVER['REDIRECT_URL']);
        $action = $filter[count($filter) - 1];

        $filter = array_map(function($e){
            return ucfirst($e);
        }, $filter);
        array_pop($filter);

        $request['query_string'] = $_SERVER['QUERY_STRING'];
        $request['method'] == $_SERVER['REQUEST_METHOD'];

        $controller = NAMESPACE_CONTROLLER . implode('\\', $filter) . 'Controller';
        $c = new $controller();
        $c->$action($request);
    }
}

APP的职责就是选择性的预处理request,然后将它传递给对应的controller做处理。

3.视图加载

加载视图的方式,我们这里用ob缓冲区的技巧加以实现:

<?php
/**
 * 作者: pitmanhuang
 * 创建时间: 2020/9/9 12:40
 * 邮箱: 1434414697@qq.com
 */

namespace Sea\Controller;

class BaseController
{
    public function fetch($path)
    {
        $path .= '.blade.php';
        ob_start();
        include_once NAMESPACE_VIEW . '\\'  . $path;
        $result = ob_get_contents();
        ob_end_clean();
        echo $result;
    }
}

4.目录结构

5.运行结果

如无特殊说明,文章均为本站原创,转载请注明出处。如发现有什么不对的地方,希望得到您的指点。

发表评论

电子邮件地址不会被公开。 必填项已用*标注