2015-03-29 12 views
5

Ho una semplice API RESTful che è già stata creata utilizzando Slim Framework.Genera documentazione automatica SlimFramework

Esempio di codice:

$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) {...}); 
    }); 
}); 

Ora, ho bisogno di costruire una semplice pagina che lista i gruppi tutti i miei percorsi come 'risorse' e nido gli itinerari sotto ogni gruppo in modo che io possa aggiungere qualche tipo di documentazione di testo per ciascun gruppo/metodo di percorso che conserverò più avanti nel database o nella memoria dei file.

In sintesi le mie domande sono:

  1. C'è qualcosa di simile esiste già?
  2. Come è possibile elencare tutti i percorsi e i gruppi di percorsi in Slim Framework?

mio Hack corrente:

$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); 
}); 

mi dà un risultato in questo modo:

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] 
       ) 

     ) 
+0

Abbiamo utilizzato [Swagger] (http://swagger.io/) per le nostre API REST basate su Java al lavoro. È molto carino. Tuttavia richiede di rivelarlo secondo le sue specifiche. Detto questo, esiste un progetto [Swagger-PHP] (https://github.com/zircote/swagger-php/) che consente di utilizzare blocchi/annotazioni doc standard per farlo. Probabilmente mi piacerebbe provare ad agganciare qualcosa di simile, o semplicemente regolare [PHPDocumentor] (http://www.phpdoc.org/) (anche se phpdoc dosnt ha tag specifici dell'API fuori dalla scatola). – prodigitalson

risposta

0

così ho voluto fare esattamente questo ha alcune limitazioni, ma si arriva parte del modo lì.

Ho utilizzato il middleware slim e creato il mio middleware. http://docs.slimframework.com/middleware/overview/

Quindi ogni volta che veniva utilizzato un percorso, ottenevo lo schema di richiesta e il metodo. Se fosse un get, userei la funzione php reflection per ottenere il tipo di variabile intero o stringa. se fosse un post, otterrei il corpo della richiesta analizzandolo e otterrò i tipi di variabile. Quindi li salverei in un file json (un file per ogni percorso) semi seguendo la specifica swagger-ui. Quindi indicherei swagger-ui su un altro script php che guarderebbe la directory con tutti i file json e ho messo tutto insieme io in un file json che seguiva lo swagger-ui json spec e io echo quel json a swagger-ui .

Questo metodo lascia un po 'a desiderare come le descrizioni di tutto ma ci ha portato lì .. qualcosa lo allinea.

`

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); 

` In ogni modo spero che aiuta.

Problemi correlati