来自博客:神的尾巴,原文链接
已提交到github,路由组件代码,代码质量一般,大家将就着看 : )
组件思路
现在都是单入口,通过index.php
配置组件,然后通过组件dispatch
,来调用指定的控制器。
另外这个框架作为后端纯Api
框架。没有PHP模板引擎
,所有与前端的数据交互都通过json
(推荐)或xml
。所以要支持跨域
,也要支持RESTFul风格
的请求。
当前实现了的一些特性
自动调用控制器,处理请求。
专门解析参数的
Param
工具类。PHP
不处理PUT
请求过来的参数,添加Parser
工具类,有解析器FormData
,Json
,用来处理前端发过来的数据。包含上传文件的解析(设置到临时文件,对于比较小的文件直接获取文件内容,可以自己配置)。
当前博客就是用这个组件写的,代码也在github上。
还需完善的一些地方(近几天抽空解决下)
-
自定义路由:添加正则匹配。
例如`/article/:id`,自动配置整数,并设置到参数id。 [ 'url' => '/article/:id', 'filter' => [ 'id' => '/\d+/' ] #'controller' => 'Article@detail' 'real' => '/article/detail/:id' ]
实现过程
composer.json
配置
{
"name": "godtail/router",
"description": "Easy router, no config, support RESTFul.",
"license": "MIT",
"require": {
"php": ">=5.3.3"
},
"autoload": {
"psr-4": {"Godtail\\Router\\": "./src"}
}
}
需要的配置
'deep' => 2, #控制器层数
'default' => ['Index', 'index'], #默认,自动补全
'namespacePre' => 'Service\\', #控制器命名空间前缀
'classSuffix' => 'Service', #控制器类名后缀
'crossDomain' => [ #跨域设置
'allowOrigin' => 'http://test.net',
'maxAge' => '86400',
'headers' => 'Content-Type',
'methods' => 'OPTIONS, GET, PUT, POST, DELETE',
]
如何获得比较好的URL风格
通过nginx rewrite
,把匹配不到的url
,rewrite
为index.php?/$uri
。
location / {
try_files $uri $uri/ /index.php?/$uri;
}
这样godtail.cn/index.php?/article/tag
,就可以写成godtail.cn/article/tag
。
路由分层和URL参数解析
config的deep参数,用来配置路由多少层,如果功能比较简单可以只分为2层,如果分module,则可以分成3层。
获取URL,根据/拆分。
例如`deep=2`, `godtail.cn/article/tag/page/2`,把page设置到Params。
Params: 保存着一个静态变量$data,用来存放请求过来的参数。
提供get,set,parse方法。
FormData的解析
如果通过POST
过来的请求,PHP
能够处理,设置到$_POST
或者$_FILES
,但是如果是PUT请求,则需要自己处理php://input数据流
。
FormData的格式
------boundary--------['--'+boundary]
name=1
content-type=xxxx
[换行]
数据内容1
------boundary--------['--'+boundary]
name=2
content-type=xxxx
[换行]
数据内容2
------boundary---------[最后一个'--'+boundary+'-']
目前是通过正则来解析处理的,如果设置了saveFile。使用tempnam
生成临时文件。
启用
#设置配置
Router::config($config['router']);
#dispatch
Router::dispatch();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。