Php 如何使用Slim在所有REST URI中接受排序和分页参数?

Php 如何使用Slim在所有REST URI中接受排序和分页参数?,php,api,rest,url-routing,slim,Php,Api,Rest,Url Routing,Slim,我正在使用Slim PHP框架为我的应用程序创建一个RESTful API。我希望所有的URL能够接受排序和分页参数。有人能告诉我最好的方法吗 另外,有人能为我提供一些适当的REST URI吗?(即) 有很多方法可以解决这个问题,我建议使用,因此您在父类中定义了一个常见的行为,并在子类中处理特定的细节 abstract class SortPageHandler { public function getUrlHandler($app) { $me = $this; r

我正在使用Slim PHP框架为我的应用程序创建一个RESTful API。我希望所有的URL能够接受排序和分页参数。有人能告诉我最好的方法吗

另外,有人能为我提供一些适当的REST URI吗?(即)


有很多方法可以解决这个问题,我建议使用,因此您在父类中定义了一个常见的行为,并在子类中处理特定的细节

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()
方法都是特定于每个实体的。通过在
SortPageHandler
中声明此方法
abstract
,我们强制所有子类实现此功能

现在,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();

一如既往,您可以进一步重构此代码,但这是为了让您了解如何解决此问题。

很高兴您得到了我的投票。有一点是,它总是创建三个处理程序实例,但最多只使用一个。我不知道PHP是否通过惰性构造优化了这一点。在这种情况下,使用抽象类就足够了。
$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();