标记 / 小瓶子
轻松创建RESTful API和服务。基于Klein.php
Requires
- php: >=5.3.0
- ehough/chaingang: 1.0.3
- geraintluff/jsv4: dev-master
- klein/klein: dev-master
Requires (Dev)
- hafriedlander/phockito: dev-master
- phpunit/phpunit: 3.7.x
This package is not auto-updated.
Last update: 2024-09-23 14:39:55 UTC
README
这是一个围绕Klein的包装器,允许轻松构建RESTful URL和控制器。
URL映射到基于路由映射的控制器,控制器处理HTTP请求/响应。控制器可以响应路由类型,一个用于资源,另一个用于集合(同一资源)。
路由
路由看起来像这样 /owners/[a:name]/dogs 或 /users/[:userid]/photos/[i:photoid]
方括号中的值将与控制器匹配并作为查询参数传递。对 /owners/george/dogs?color=brown 的请求将变为
name = george
color = brown
冒号后面的值是参数名,而前面的值是验证类型。
有关路由语法的更多信息,请参阅https://github.com/chriso/klein.php#routing
路由器接受一个参数,该参数是一个数组,其中包含映射到控制器的路由,如下所示
"routes" => array( # requests to /api/v1/hello handled by tag_tool_api_v1_hello "/login" => "login", # a namespace URL. Children of this are appended. "/users/[i:userid]" => array( "/loginhistory" => "loginhistory", "/messages" => "messages", "/photos" => "photos", "/photos/[i:photoid]" => "photos" ) )
其中键是路由路径,值是命名空间。如果值是字符串,则该数组中的路由将嵌套在父路径下。路由器还接受一个参数定义路由命名空间,另一个参数定义控制器命名空间。
如果您的域是 www.mypets.com,则路由命名空间 /api/v1,控制器命名空间 /app/controllers,则由此生成的路由是
/api/v1/login => /app/controllers/login.php
/api/v1/users/[i:userid]/loginhistory => /app/controllers/loginhistory.php
/api/v1/users/[i:userid]/messages => /app/controllers/messages.php
/api/v1/users/[i:userid]/photos => /app/controllers/photos.php
/api/v1/users/[i:userid]/photos/[i:photoid] => /app/controllers/photos.php
每个路由支持HTTP方法由控制器确定。路由要么作为集合处理,要么作为资源处理。资源作用于单个记录(数据库行),集合作用于多个记录(数据库表)。在上面的示例中,对 /api/v1/users/[i:userid]/photos 的请求将由控制器作为集合处理,而对 /api/v1/users/[i:userid]/photos/[i:photoid] 的请求作为资源处理。这是由资源路由以id/参数([i:photoid])结尾的约定以及集合以集合名称结尾(photos)来确定的。
控制器
控制器处理HTTP请求。处理方法期望传递一个请求和一个响应对象。默认映射如下,这可以在主路由对象中重写。控制器不需要扩展任何内容,只需实现这些方法之一。未实现的方法在请求时将变为HTTP 405错误。
每个控制器方法都传递一个响应和一个请求对象。请参阅https://github.com/chriso/klein.php/wiki/Api获取文档。
控制器还支持自定义操作。如果控制器有公共方法 public function translate($request, $response)
,那么对 /api/v1/languages/translate?from=english&to=esperanto 的POST请求将调用语言控制器的translate方法。如果控制器上不存在请求的方法,则响应404。
如果启用开发模式,则允许对自定义操作进行GET请求。
用法
将其放入index.php文件中
<?php $urlRoot = '/api/v1'; $routes = array( "/login" => "login", "/users/[i:userid]" => array( "/loginhistory" => "loginhistory", "/messages" => "messages", "/photos" => "photos", "/photos/[i:photoid]" => "photos" ) ); $controllerPrefix = "tag_admin_api_v1"; $router = new tag_routing_core( $urlRoot, $routes, $controllerPrefix ); //defualt uses $_SERVER vars $router->routeRequest(); //Or specify directly (useful for manual driving and tests) $router->routeRequest($_SERVER['REQUEST_URI'], $_SERVER['HTTP_METHOD]);
最好将所有这些放入配置文件中,并在索引文件中加载它们。
控制器示例
<?php class tag_admin_api_v1_photos { // list all photos for a user public function index($request, $response) { $uid = $request->userid; $list = $_TAG->dao->album[$uid]->getAll(); $response->json($list); } // get a single photo public function fetch($request, $response) { $uid = $request->userid; $pid = $request->photoid; $response->json($_TAG->photo[$uid][$pid]); } }
依赖项
小克莱因(用于路由) https://github.com/chriso/klein.php Phockito用于测试