Я использую платформу Slim PHP для создания RESTful API для своего приложения. Я бы хотел, чтобы все URL-адреса могли принимать параметры для сортировки и разбивки на страницы. Может ли кто-нибудь сказать мне лучший способ сделать это?
Кроме того, может ли кто-нибудь предоставить мне некоторые правильные URI REST? (например, 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() .'}}'; } } ?>
Есть много способов решить эту проблему, я бы рекомендовал использовать шаблон Template Method , поэтому вы определили общее поведение в родительском классе и обрабатываете конкретные детали в дочерних классах.
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
мы вынуждаем все подклассы реализовать эту функциональность.
Теперь тонкие коды выглядят очень чистыми:
$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();
Как всегда, вы можете реорганизовать этот код еще больше, но это даст вам представление о том, как это можно решить.