临摹了一个 PHP MVC 框架

框架是 slim,https://github.com/codeguy/Sli…,人如其名,真的很 slim,用起来也很简单,就这么几行就可以跑起来了

<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/:name', function($name) {
	echo "Hello, $name";
});

$app->run();

需要配合这个 apache 重写规则

RewriteEngine On

# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
# RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

运行效果如图

跟着源码临摹了一个,现在已经可以跑上面那个例程了,临摹的方法就是顺着函数调用栈,用到哪个就去抄哪个函数过来,呵呵,这么搞现在应该是最简的能跑的了吧

附上现在源码 slim2

调用也是一样的

<?php
require 'Slim2/Slim2.php';
$app = new Slim2();
$app->get('/:name', function($name) {
	echo "Hello, $name";
});

$app->run();

运行效果也是一样的

现在只是实现了最简的

  • 一个环境资源类
  • 一个封装了请求的类
  • 一个路由器类
  • 一个路由规则类
  • 还有把他们结合在一起的核心类

目前没有实现中间件

在这个框架中,一次请求其实这么来实现的

  1. 请求从 index.php 这个统一入口进来
  2. index.php 构造一个 slim 的实例对象
  3. slim 对象在初始化的时候构造运行环境类(environment),还有请求类(request),以及一个回应类(response),和一个路由器类(router)
    1. 环境类顾名思义负责收集和整合运行环境的信息,包括请求方法,远端 IP,请求路径,运行的服务器名,服务器端口等等
    2. 请求类其实跟环境的内容有稍稍重复,不过他更是明确职责一些,封装的内容也就是请求方法,请求路径等
    3. 回应类主要负责响应的 http header,还有 set get cookie,还有就是响应正文了
    4. 路由器类管理众多的路由规则,每个路由规则对应一个路由类的实例,同时负责匹配路由的选取(是选取,他不负责具体的匹配计算,匹配计算由每个路由类的实例自己完成)
    5. 路由类负责解析请求的字符串,把他们正则匹配解析到变量中,以备响应函数的使用
    6. 然后就是总揽全局的调用类了,(虽然我没有实现中间件类,但是这个框架却把自己这个调用者本身也当作一个中间件),这个总管的 call 函数负责把请求送到路由器中,让他去求得命中的路由,然后调用该路由的 callable 函数,然后送到响应类去输出
  4. 后面应该还要实现一些模版,渲染引擎之类的东西,现在还没做

=============================================================

2012-08-31 15:26:59 update 发现了框架作者自己写的一篇文章讲一个请求的生命周期的,比我这清晰多了,http://www.slimframework.com/r…,另外买一送一附送一篇,http://www.slimframework.com/r…

One thought on “临摹了一个 PHP MVC 框架

  1. Pingback: 从点击到呈现 — 详解一次HTTP请求(3) | ZRJ

Leave a Reply

Your email address will not be published. Required fields are marked *