3

Slim PHP フレームワークを使用して、アプリ用の RESTful API を作成しています。すべての URL で、並べ替えとページ付けのパラメーターを受け入れることができるようにしたいと考えています。誰かがこれを行うための最良の方法を教えてもらえますか?

また、誰かがこれに対する適切な REST URI を提供してくれませんか? (つまりhttp://domain.com/api/category/fruit/?sort=DESC&results=25&page=2 )

<?php

require 'Slim/Slim.php';

$sort = "ASC";
$results = 10;
$page = 1;

$app = new Slim();

$app->get('/wines',  function () use ($app) {
  $sort = $app->request()->params('sort');
  $results = $app->request()->params('results');
  $page = $app->request()->params('page');

  getWines();
});

$app->get('/categories',  function () use ($app) {
  $sort = $app->request()->params('sort');
  $results = $app->request()->params('results');
  $page = $app->request()->params('page');

  getCategories();
});

$app->get('/sub-categories',  function () use ($app) {
  $sort = $app->request()->params('sort');
  $results = $app->request()->params('results');
  $page = $app->request()->params('page');

  getSubCategories();
});

$app->run();

function getWines() {
  $sql = "select * FROM wine ORDER BY name " . $sort . " LIMIT " . $page . " , $results";
  try {
    $db = getConnection();
    $stmt = $db->query($sql);  
    $wines = $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;
    echo '{"wine": ' . json_encode($wines) . '}';
  } catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
  }
}

?>
4

1 に答える 1

5

これを解決するには多くの方法があります。テンプレート メソッド パターンを使用することをお勧めします。そのため、親クラスで共通の動作を定義し、子クラスで特定の詳細を処理します。

abstract class SortPageHandler {
  public function getUrlHandler($app) 
  {
    $me = $this;
    return function () use ($app, $me) {
      $sort = $app->request()->params('sort');
      $results = $app->request()->params('results');
      $page = $app->request()->params('page');

      $app->response()->write($me->getItems($sort, $results, $page));
    };
  }

  abstract public function getItems($sort, $results, $page);
}

class WineHandler extends SortPageHandler {
  public function getItems($sort, $results, $page) 
  {
    //return wines
  }

}

class CategoryHandler extends SortPageHandler {
  public function getItems($sort, $results, $page) 
  {
    //return categories
  }
}

class SubCategoryHandler extends SortPageHandler {
  public function getItems($sort, $results, $page) 
  {
    //return sub-categories
  }
}

したがって、親クラスSortPageHandlerは、Slim に必要な機能と、ページネーションおよびソートで共通部分を処理します。各getItems()メソッドは、各エンティティに固有です。このメソッドabstractを宣言することで、SortPageHandlerすべてのサブクラスにこの機能を実装させます。

これで、Slim コードは非常にきれいに見えます。

$app = new \Slim\Slim();

$wineHandler = new WineHandler();
$categoryHandler = new CategoryHandler();
$subCategoryHandler = new SubCategoryHandler();

$app->get('/wines', $wineHandler->getUrlHandler($app));
$app->get('/categories', $categoryHandler->getUrlHandler($app));
$app->get('/sub-categories', $subCategoryHandler->getUrlHandler($app));

$app->run();

いつものように、このコードをさらにリファクタリングすることもできますが、これは、これをどのように解決できるかを示すためのものです。

于 2012-11-20T16:49:54.193 に答える