【问题标题】:Generate Automatic documentation SlimFramework生成自动文档 SlimFramework
【发布时间】:2015-06-02 14:52:31
【问题描述】:

我有一个使用 Slim 框架构建的简单 RESTful API。

代码示例:

$app->group('/settings','authenticate','is_admin',function () use($app){
    $app->get('/gear', function () use ($app) {
        ...
    });

    $app->group('/users',function() use($app){
        $app->get('/', function () use ($app) {...});
        $app->post('/', function () use ($app) {...});
        $app->put('/:id', function ($id) use ($app) {...});
        $app->delete('/:id', function () use ($app) {...});
    });
});

现在,我需要构建一个简单的页面,将我的所有路由组列为“资源”,并将路由嵌套在每个组下,以便我可以为每个路由组/方法添加某种文本文档,稍后我会坚持在数据库或文件存储中。

总的来说,我的问题是:

  1. 是否已经存在类似的东西?
  2. 如何在 Slim Framework 中列出所有路由和路由组?

我目前的黑客:

$app->get('/', function () use ($app) {
    $data=[];
    //$router->routes is a protected variable, so i had to change it to public, same for $r->methods and pattern
    foreach($app->router->routes as $r){
        $x = explode('/',$r->pattern);
        $x = $x[1];
        $data[$x][$r->methods[0]][]=$r->pattern."[".implode(',',$r->middleware)."]";
    }
    print_r($data);
});

我给出的结果是这样的:

Array
(
    [auth] => Array
        (
            [GET] => Array
                (
                    [0] => /auth/me[authenticate]
                    [1] => /auth/logout[]
                )

            [POST] => Array
                (
                    [0] => /auth/login[]
                )

            [DELETE] => Array
                (
                    [0] => /auth/logout[]
                )

        )

    [settings] => Array
        (
            [GET] => Array
                (
                    [0] => /settings/classes[authenticate,is_admin]
                    [1] => /[authenticate,is_admin]
                )

            [POST] => Array
                (
                    [0] => /settings/grades/:id/class[authenticate,is_admin]
                    [1] => /settings/grades/:id/subject[authenticate,is_admin]
                    [2] => /settings/departments/:id/grade[authenticate,is_admin]
                    [3] => /settings/subjects/:id/skills[authenticate,is_admin]
                )

        )

【问题讨论】:

  • 我们在工作中一直使用Swagger 来处理我们基于 Java 的 REST API。它相当不错。但是,它要求您根据其规范显示它。也就是说,有一个Swagger-PHP 项目可以让你使用标准的文档块/注释来做到这一点。我可能会考虑挂钩这样的东西,或者只是普通的PHPDocumentor(尽管 phpdoc dosnt 有任何开箱即用的 API 特定标签)。

标签: php reflection slim


【解决方案1】:

所以我想做到这一点,它有一些限制,但它会让你成为其中的一部分。

我使用了 slim 中间件并创建了自己的中间件。 http://docs.slimframework.com/middleware/overview/

然后每次使用路由时,我都会得到请求模式和方法。如果它是一个 get 我会使用 phps 反射函数来获取变量类型整数或字符串。如果它是一个帖子,我会得到请求正文解析它并获取变量类型。然后我会按照 swagger-ui 规范将这些保存到一个 json 文件(每条路线一个文件)中。然后,我将 swagger-ui 指向另一个 php 脚本,该脚本将查看包含所有 json 文件的目录,然后将它们放在一起,然后放在一个遵循 swagger-ui json 规范的 json 文件中,然后将该 json 回显到 swagger-ui .

这种方法还有很多不足之处,比如对所有内容的描述,但它让我们到达了那里.. 这条线。

`

class MyMiddleware extends \Slim\Middleware
{
public $myRoute;
    public function call()
    {
                //The Slim application
                $app = $this->app;
                $this->app->hook('slim.before.dispatch', array($this, 'onBeforeDispatch'));
                //The Environment object
                $env = $app->environment;
                //The Request object
                $req = $app->request;
                $method = $req->getMethod();
                $return['operations'] = array('method'=> $req->getMethod(),"summary" =>'',"type"=>'',"nickname"=>'',"parameters"=>array());
                if($method == "POST"){
                        $parameters = json_decode($env->offsetGet('slim.input'));
                        $return['operations']['parameters'] = $parameters;
                }
                //The Response object
                $res = $app->response;
                $body = $res->getBody();
                $this->return = $return;
                //call the next middleware
                $this->next->call();
    }
         public function onBeforeDispatch()
    {
        $route = $this->app->router()->getCurrentRoute();
        $this->myRoute = $route;
         $return['path'] = $route->getPattern();
                $return = $this->return;
                if($return['operations']['method'] == "GET"){
                        $refFunc = new ReflectionFunction($route->callable);
                        foreach ($refFunc->getParameters()  as $refParameter) {
                                $return['operations']['parameters'] = array();
                                $return['operations']['parameters']['name'] = $refParameter->name;
                                $return['operations']['parameters']['required'] = $refParameter->isOptional();
                        }
                }
                echo json_encode($return);
    }
}
$app->add(new MyMiddleware);

` 无论如何,我希望它有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多