Zal*_*oza 5 php reflection slim
我有一个简单的RESTful API,它已经使用Slim Framework构建.
代码示例:
$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) {...});
});
});
Run Code Online (Sandbox Code Playgroud)
现在,我需要构建一个简单的页面,将所有路由组列为"资源",并将路由嵌套在每个组下,以便我可以为每个路由组/方法添加某种文本文档,稍后我将在数据库中保留这些文档或在文件存储中.
总之,我的问题是:
我目前的哈克:
$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);
});
Run Code Online (Sandbox Code Playgroud)
我给出了这样的结果:
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]
)
)
Run Code Online (Sandbox Code Playgroud)
所以我正是想做到这一点,它有一些限制,但它会帮助你实现这一目标。
我使用了 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);
Run Code Online (Sandbox Code Playgroud)
无论如何,我希望它能有所帮助。