2013-09-15
这次描述的是在“给自己写一个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 />';
}
}
}
}
以下是访问结果:
404
当index.php找不到根据用户的请求找不到相应的类或者方法时候,会抛出异常,默认情况下index.php会将异常的信息显示出来。当然我们也可以指定转到404页面,只需要修改index.php的最后的catch语句块即可。
如何访问图片、css等静态文件
根据根目录下.htaccess的配置,我们可以再根目录下建立名称以“static”开头的目录,将图片、js、css等放在这个目录中,像平常那样去引用这些静态文件即可。