如何使用 Slim 在所有 REST URI 中接受排序和分页参数? [英] How to accept sorting and pagination parameters in all REST URIs using Slim?

查看:13
本文介绍了如何使用 Slim 在所有 REST URI 中接受排序和分页参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using the Slim PHP framework to create a RESTful API for my app. I would like all URLs to be able to accept parameters for sorting and pagination. Can someone tell me the best way to do this?

另外,有人可以为此提供一些适当的 REST URI 吗?(即 http://domain.com/api/category/fruit/?sort=DESC&results=25&page=2)

Also, can someone provide me with some proper REST URIs to this? (i.e. 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() .'}}'; 
  }
}

?>

推荐答案

有很多方法可以解决这个问题,我建议使用 模板方法模式,所以你在父类中定义了一个共同的行为,在子类中处理具体的细节.

There are many ways to solve this, I would recommend to use the Template Method pattern, so you defined a common behavior in the parent class, and handle the specific details in the child classes.

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,我们强制所有子类实现此功能.

So the parent class SortPageHandler handles the common part with the function needed for Slim and the pagination and the sorting. Each getItems() method is specific to each entity. By declaring this method abstract in SortPageHandlerwe force all sub-classes to implement this functionality.

现在 Slim 代码看起来很干净:

Now the Slim codes looks very clean:

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

与往常一样,您可以进一步重构此代码,但目的是让您了解如何解决此问题.

As always, you could refactor this code even more, but it's to give you an idea how this could be solved.

这篇关于如何使用 Slim 在所有 REST URI 中接受排序和分页参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆