给自己写一个php框架(2)

2013-09-15

给自己写一个php框架-1
给自己写一个php框架-2
TPP —— 一个简单的PHP框架
使用TPP做一个简单的登录系统

这次描述的是在“给自己写一个php框架-1”的基础上实现的支持RESTful url的版本。

该版本的实现目标是所有的访问(除了图片、css之类)都经过web app根目录下的index.php,而在url中又不会显示出index.php。姑且将该框架命名为tinierPHP2,源码在https://github.com/letiantian/tinierPHP2下载。

新版本的文件布局


tinierPHP2
├── Config
│   ├── Config.php
│   └── Loader.php
├── Controller
│   ├── Show.php
│   └── Welcome.php
├── Corelib
│   ├── Medoo.php
│   ├── Rcache.php
│   ├── Render.php
│   └── Test.php
├── static
├── Template
│   ├── 1.php
│   └── 2.php
├── Userlib
└── index.php

tinierPHP2比tinierPHP多了一个Controller目录,该目录用来存放控制器以实现业务逻辑,Welcome.php是默认的控制器,一般只需要实现其index()方法;Show.php是写来测试玩~的。

配置.htaccess


我们使用开启了rewrite模块的Apache服务器,在web app根目录下创建文件.htaccess,加入以下内容:

RewriteEngine on
RewriteCond $1 !^(index\.php|static|robots\.txt)   
RewriteRule ^(.*)$ index.php/$1 [L]

第二行指定能够基于文件系统结构访问的资源index.php、robots.txt以及名字以static开头的文件或者目录。当用户请求的资源不满足第二行的条件时候,第三行就起作用了。第三行用来将其他所有的请求交给index.php处理,这同时也实现了在url中隐藏index.php。
上文件配置好后,建议将其他子目录中的.htaccess内容清空。

index.php做了什么


index.php所做的主要工作就是根据用户的请求调用相应控制器的相应方法。

如何调用

在不自定义url映射的情况下,有以下情况:
用户访问“/”,则调用默认控制器Welcome的index方法;
用户访问“/aa”,则调用控制器Aa的index方法;
用户访问“/aa/bb”,则调用控制器Aa的bb方法;
用户访问“/aa/bb/cc”,则调用控制器Aa的bb方法,并将数组[0=>’cc’]作为bb方法的参数;
用户访问“/aa/bb/cc/dd”,则调用控制器Aa的bb方法,并将数组[0=>’cc’,1=>’dd’]作为bb方法的参数。
如果定义了url映射,即在数组$url_maps中添加了内容,例如:

$url_maps = [
    '/hello/' => '/welcome/hello/'
];

如果用户请求的资源为/hello,则会去调用控制器Welcome的hello方法。

配置tinierPHP2


在tinierPHP2中,不需要在Config/Loader.php中配置变来那个$_root_dir。Loader会在根目录的index.php中实例化,这里使用了getcwd()获取web app的根目录,由于是单例模式,所以在之后调用的类中仍然可以使用同一个Loader,当然,千万别覆盖它。

Config/Config.php中的$_site_url变量还是需要配置的。

在index.php中有两个地方需要根据需要进行配置:
$default_controller变量用来指定默认的控制器;
$url_maps数组用来自定义url。

另外,Config/Loader.php中添加了load_controller()方法,这个方法开发人员一般用不到。另外如果找不到类或者控制器,Loader类会抛出异常。

怎样去写控制器


我们在Controller/目录中添加控制器,不建议有子目录。控制器名即类名需要与文件名相同。默认调用index()方法。控制器中的方法只允许一个参数,index.php会自动将用户请求的参数打包成数组,传递给指定控制器的指定方法。

在方法中加载类库有两种方法,第一种是使用Loader::get_instance()加载类库,第二种是使用index.php中的变量$TP_config。其实两者是一样的。
下面是一个示例:

在Template/目录下创建模板1.php,内容如下:

test template <br/>

修改在Controller/目录下的默认控制器Welcome.php:

class Welcome
{
    public function index()
    {
        global $TP_config;
        global $TP_loader;
        $render = $TP_loader->load_core_class('Render');
        $render ->render('1');
        $render ->show();
    }
    public function hello($args = null)
    {
        echo "hello , letian<br />";
        if ($args != null) {
            foreach($args as $arg) {
                echo $arg . '<br />';
            }
        }
    }
}

以下是访问结果:

image

image

image

404


当index.php找不到根据用户的请求找不到相应的类或者方法时候,会抛出异常,默认情况下index.php会将异常的信息显示出来。当然我们也可以指定转到404页面,只需要修改index.php的最后的catch语句块即可。

如何访问图片、css等静态文件


根据根目录下.htaccess的配置,我们可以再根目录下建立名称以“static”开头的目录,将图片、js、css等放在这个目录中,像平常那样去引用这些静态文件即可。

( 完 )