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

2024-04-04

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

另外,有人可以为我提供一些适当的 REST URI 吗? (IE。)

<?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() .'}}'; 
  }
}

?>

有很多方法可以解决这个问题,我建议使用模板方法模式 http://en.wikipedia.org/wiki/Template_method_pattern,因此您在父类中定义了公共行为,并在子类中处理特定的细节。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Slim 接受所有 REST URI 中的排序和分页参数? 的相关文章

  • 如何修复 Laravel 中未找到的“PDF”类

    在我的 Laravel 应用程序中遇到以下错误 CollaboPDFController php 第 14 行中的 FatalErrorException 未找到 PDF 类 这是我的ColaboPDFController php
  • PHP cURL 重定向到本地主机

    我正在尝试使用带有 cURL 的 php 脚本登录外部网页 我是 cURL 的新手 所以我觉得我错过了很多东西 我找到了几个例子并修改了它们以允许访问https页面 最终 我的目标是能够登录页面并在登录后通过指定的链接下载 csv 到目前为
  • XP及PHP MYSQL 练级系统

    我已经查看了所有提出的问题和答案 但我似乎找不到最适合我的答案 我想做的是开发一个系统 当用户达到一定的 XP 限制时 系统会进入下一个级别 它显示了下一个 XP 之前需要多少 XP So lvl1 0 gt lvl2 256 gt lvl
  • 理想的 PHP 会话大小?

    我有一个 PHP 表单 抵押应用程序 大约有 400 个字段 该网站的流量会很低 对于进入 MySQL 数据库的 400 个字段 理想的会话大小是多少 In php ini我要设置什么 我应该设置我缺少的任何内容吗 会话的大小没有限制 但
  • 将扩展配置文件实体添加到 FOS UserBundle

    我正在尝试扩展 FOS UserBundle 以允许扩展配置文件实体除了基本 UserBundle 字段之外还保存其他信息 因为我的网站上有多种类型的用户 所以我创建了单独的实体来保存个人资料信息 我的实体设置如下 class UserPr
  • 如何在 PHP 中将默认日期设置为波斯日期?

    如何在 PHP 中将默认日期设置为波斯日期 说吧 如果我echo这个功能date Y m d 然后它会显示2018 03 05但我想要1396 12 14波斯日期 请检查 http php net manual en intldatefor
  • php递归合并

    我需要以某种不同的方式合并一些数组 我使用 array merge recursive 然而 有一些事情我需要改变 但我不知道如何改变 这是来自 php net 的引用 但是 如果数组具有相同的数字键 则后面的值 不会覆盖原始值 但会追加
  • 为什么使用闭包进行赋值而不是直接将值赋给键?

    我当时正在看在 7 10 他添加了一个数据库依赖项并使用闭包来分配值 我的问题是为什么不直接使用直接赋值 我的意思是不这样做 container db capsule 相当于这样做 container db function contain
  • filter_input() 何时删除 POST 变量的斜杠?

    我创建了一个小型 PHP 脚本 它在 PHP 5 2 17 的服务器上运行magic quotes gpc指令已启用 我没有对 php ini 文件的写访问权限 并且我想从用户输入中删除所有斜杠 即使magic quotes gpc指令被关
  • 正确的标头 php mysql blob 显示图像

    我正在尝试在我的 PHP 页面中显示来自 mysql blob 的图像 我知道这不是最佳实践 然后我会将其引入我的 iOS 应用程序中 我在设置页面标题时遇到问题 我认为需要将其设置为图像 所以 这显示了图像 但我不相信页眉是正确的 hea
  • PHP别名@函数

    我是 PHP 新手 看到一些使用 前缀调用函数 如 mysql ping 的示例 我感到很困惑 它是做什么用的 谷歌搜索 搜索没有太大帮助 因为 被丢弃并且 别名 不是足够好的关键字 抑制错误 警告和通知 如果你用自定义的方式补充它 你可以
  • Laravel 类邮件程序不存在

    我将应用程序从 5 更新到 5 2 现在 当我调用 Mail send 时 它会返回一个异常 Class mailer 不存在 Mail send emails mail data gt content function m use to
  • Laravel 上传前如何压缩图像?

    我正在制作一个图片库网站 用户可以在其中上传任何图像 它们将显示在前端 我需要在不影响图像质量的情况下压缩图像 以减小图像大小 以便页面加载速度不会影响那么大 我使用以下代码来上传图像 rules array file gt require
  • 无法在 PHPUnit 中使用数据提供程序运行单个测试

    使用命令行运行测试时遇到问题 如果我像这样运行 phpunit phpunit no configuration filter testAdd DataTest DataProviderTest php 效果很好 但是我们使用正则表达式来准
  • PHP:展平数组-最快的方法? [复制]

    这个问题在这里已经有答案了 是否有任何快速方法可以在不运行 foreach 循环的情况下展平数组并选择子键 在本例中为 键 和 值 或者 foreach 始终是最快的方法 Array 0 gt Array key gt string val
  • 如何使用xquery查找节点并向其添加子节点?

    是否可以使用xpath xquery查询特定的xml节点 然后向其导入 添加子节点 示例 代码取自http codepad org gJ1Y2LjM http codepad org gJ1Y2LjM 这是在类似的问题中提出的 但不相同 1
  • Heredoc:常用的“EOT”实际上是什么意思?

    PHP s 定界例子 http www php net manual en language types string php language types string syntax heredoc似乎总是使用 EOT 有时是 EOD 作
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • 如何在 PHP >= 5.3 严格模式下向对象添加属性而不产生错误

    这必须很简单 但我似乎找不到答案 我有一个通用的 stdClass 对象 foo没有属性 我想添加一个新属性 bar尚未定义 如果我这样做 foo new StdClass foo gt bar 1234 严格模式下的 PHP 会抱怨 将属
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我

随机推荐

  • 每次 RxSwift 中 UITextField 文本属性更改时如何获取信号

    如何从以编程方式对 UITextField 文本属性进行的更改中获取信号 通过使用 rx text 仅当用户通过键盘输入文本时报告信号 如果您以编程方式设置 textField text 则信号不会触发 这就是我使用 rx text 的方式
  • 如何将 3D 点云导出为渲染的体素网格?

    我有一个由几个彩色体素组成的场景 当在 meshlab 中打开它时 所有点都被绘制为二维正方形 是否可以在网格实验室中渲染一个场景 其中正方形被 3D 立方体替换 并具有额外的闪电 反射率 这是我到目前为止得到的 我宁愿想要这样的东西 我为
  • 使用 protobuf 作为文本配置文件

    我最近遇到一个非常大的关键任务项目 其中所有配置 文件是使用文本 protobuf 定义来定义的 配置文件的意思是 人类可读和可编辑 例如 message ServerSettings required int32 port 3022 op
  • Coldfusion 中的字符串“00”等于“.0”?还有什么?

    所以我注意到 ColdFusion 回来了true对于条件 00 0 这可以在 CF 9 1 和 CF 10 中重现 我可以通过添加一个轻松解决这个问题find foo 条件 但这不正常 这样的事情让我对 ColdFusion 产生了怀疑
  • 使用 itextsharp 勾选 pdf 复选框

    我尝试了很多不同的方法 但我无法选中该复选框 这是我尝试过的 var reader new iTextSharp text pdf PdfReader originalFormLocation using var stamper new i
  • 在 mysql 中导出和导入 utf8 数据:最佳实践

    我们经常需要将数据文件发送给我们的一位客户 其中包含他 她需要翻译的数据库中的数据 大多数情况下 此导出为 CSV 或 XLS 大多数时候 我们使用 phpmyadmin 创建 csv 转储 并获得包含翻译数据的 xls 文件 问题是 大多
  • 在 r2017b 中使用 C++ 中的 startMATLAB 和“MatlabEngine.hpp”发出问题

    在新版本 2017b 中 Matlab 发布了新的 C MATLAB 引擎 API https fr mathworks com help matlab calling matlab engine from cpp programs htm
  • $(form).ajaxSubmit 不是函数

    我正在尝试使用 jquery 验证插件来验证表单并使用 ajax 请求提交内容 这段代码位于我的文档的头部 document ready function contact form validate submitHandler functi
  • 从命令行查找并替换多行文本

    我正在尝试使用还执行其他操作的脚本编辑配置文件 该脚本需要找到某些连续的文本行并将其删除 它需要在适当的位置粘贴一个新配置 该新配置从旧配置所在的同一行开始 在新旧配置中 空间的使用都很重要 在 configfile php 中 此文本块
  • 如何在开源(Github + Heroku)应用程序中保护 Google API 密钥

    我正在创建一个应用程序 希望在未来几周内开源 源代码位于 Github 上 如果通过了 Travis CI 测试 Heroku 会在有新提交时自动部署代码 在此应用程序中 我有几个 API 密钥 通过在我的 heroku dynos 中使用
  • 将 2 元素数组的数组转换为散列,其中重复的键附加附加值

    例如 给定一个数组 array a b a c c b 返回以下哈希 hash a gt b c c gt b hash Hash array 覆盖以前的关联 产生 hash a gt c c gt b 使用功能性婴儿步骤 irb 01 0
  • 未填充方块的 Matplotlib 散点图

    我想制作一个带有未填充方块的散点图 markerfacecolor不是一个被认可的选项scatter https matplotlib org devdocs api as gen matplotlib pyplot scatter htm
  • 如何让应用程序兼容所有Android手机?

    请帮助我解决我的问题 在我的大多数应用程序中 Ui 设计并不兼容所有 Android 设备 即 所有小部件在所有手机中都没有按正确的顺序对齐 我想开发一个应用程序应该适合所有手机尺寸和分辨率 大手机 普通手机和小手机 请解决这个问题 提前致
  • 使用 jQuery 绘制饼图

    我想用 JavaScript 创建一个饼图 在搜索中我发现了 Google Charts API 由于我们使用的是 jQuery 我发现有Google 图表的 jQuery 集成 http www maxb net scripts jgch
  • 针对 arm64 和 32 位架构进行编译时的基础类型

    在为 arm64 编译 iOS 应用程序的代码时 我遇到了一个有趣的问题 该问题与自定义 Foundation 类型的不同基本类型有关 假设我想 printf 或 stringWithFormat 声明为的数字NSU整数 NSString
  • EF(实体框架)“using”语句的用法

    我有一个关于 MVC 的项目 我们选择 EF 进行数据库事务 我们为 BLL 层创建了一些管理器 我找到了很多例子 其中 using使用 语句 即 public Item GetItem long itemId using var db n
  • 我将如何保存和加载 UITextField?

    我到处搜索并尝试了很多代码 但似乎没有什么对我有用 我需要做的就是加载 在 viewDidLoad 上 一个文本字段并在按下按钮时保存它 是什么easiest这样做的方法 我正在使用单窗口应用程序 我没有视图控制器 这可能会有所不同 Tha
  • 运行 sympy 中表达式的 AST

    我正在使用 sympy 来计算复杂函数表达式的一些高阶导数 我想遍历表达式的 AST 例如首先深度遍历节点 我怎么做 一个简单的深度优先旅行将是这样的 from sympy import pi sin from sympy abc impo
  • 将 JSP 包含到 sling servlet 中

    我目前正在开发一个小项目 试图帮助某人弄清楚如何连接组件 理想情况下我们想做两件事 有一个呈现模板的 jsp 我们所有的业务登录都在 SlingAllMethodServlet 中 servlet 定义要点 package definiti
  • 如何使用 Slim 接受所有 REST URI 中的排序和分页参数?

    我正在使用 Slim PHP 框架为我的应用程序创建 RESTful API 我希望所有 URL 都能够接受排序和分页参数 有人可以告诉我最好的方法吗 另外 有人可以为我提供一些适当的 REST URI 吗 IE