标记/小瓶子

轻松创建RESTful API和服务。基于Klein.php

dev-master 2014-02-07 00:00 UTC

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用于测试