From 68844a6132059da89f69a34ba59229c40e5bcace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=B8=9C=E4=BA=91?= Date: Fri, 21 Jul 2023 10:54:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(controller):=20=E5=A2=9E=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=20Rest=20=E9=A3=8E=E6=A0=BC=E7=9A=84=20trait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李东云 --- docs/REST 控制器.md | 12 +++++ src/Controller/AbstractController.php | 6 +-- src/Traits/PaginatorAble.php | 45 ---------------- src/Traits/RestfulList.php | 78 +++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 docs/REST 控制器.md delete mode 100644 src/Traits/PaginatorAble.php create mode 100644 src/Traits/RestfulList.php diff --git a/docs/REST 控制器.md b/docs/REST 控制器.md new file mode 100644 index 0000000..d9c2c0f --- /dev/null +++ b/docs/REST 控制器.md @@ -0,0 +1,12 @@ +# REST 资源控制器支持 + +## 列表的筛选、排序 + +* [**RestfulList**](../src/Traits/RestfulList.php) + +### RestfulList +在 AbstractController 中已经默认进行了集成 + +- parseParameters 用来解析请求 +- responseFormatter 用来将 builder 转化成响应 +- restSelect 额外的语法糖,调用了上面的两个方法 diff --git a/src/Controller/AbstractController.php b/src/Controller/AbstractController.php index eda0f34..6adc5bb 100644 --- a/src/Controller/AbstractController.php +++ b/src/Controller/AbstractController.php @@ -21,8 +21,8 @@ use Dont\DontToString; use Hyperf\Contract\ContainerInterface; use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Di\Annotation\Inject; -use Hyperf\HttpServer\Contract\RequestInterface; use Hyperf\HttpServer\Contract\ResponseInterface; +use Singularity\HDK\Core\Traits\RestfulList; /** * 抽象控制器基类 @@ -42,13 +42,11 @@ abstract class AbstractController use DontSerialise; use DontDeserialise; use DontToString; + use RestfulList; #[Inject] protected ContainerInterface $container; - #[Inject] - protected RequestInterface $request; - #[Inject] protected ResponseInterface $response; diff --git a/src/Traits/PaginatorAble.php b/src/Traits/PaginatorAble.php deleted file mode 100644 index 6cbe82a..0000000 --- a/src/Traits/PaginatorAble.php +++ /dev/null @@ -1,45 +0,0 @@ - - * Powered by PhpStorm - * Created on 2023/7/18 - */ - -namespace Singularity\HDK\Core\Traits; - -use Closure; -use Hyperf\Contract\LengthAwarePaginatorInterface; -use Hyperf\Database\Model\Builder; -use Hyperf\Stringable\Str; - -trait PaginatorAble -{ - public function responseFormatter( - array $options, - Builder $builder, - ?Closure $filter = null - ) { - $perPage = $options['size'] ?? null; - $order = $options['order'] ?? 'created_at'; - $sort = $options['sort'] ?? 'desc'; - $pagination = !!($options['page'] ?? $perPage ?? false); - // $group = $options['group'] ?? null; - - $builder = $builder->orderBy(Str::snake($order), $sort); - $result = $pagination ? $builder->paginate($perPage) : $builder->get(); - - if (is_null($filter)) { - return $result; - } - - if ($result instanceof LengthAwarePaginatorInterface) { - $collection = $result->getCollection(); - $collection = $filter($collection); - - return $result->setCollection($collection); - } - return $filter($result); - } -} \ No newline at end of file diff --git a/src/Traits/RestfulList.php b/src/Traits/RestfulList.php new file mode 100644 index 0000000..fb33142 --- /dev/null +++ b/src/Traits/RestfulList.php @@ -0,0 +1,78 @@ + + * Powered by PhpStorm + * Created on 2023/7/18 + */ + +namespace Singularity\HDK\Core\Traits; + +use Closure; +use Hyperf\Contract\LengthAwarePaginatorInterface; +use Hyperf\Database\Model\Builder; +use Hyperf\Di\Annotation\Inject; +use Hyperf\HttpServer\Contract\RequestInterface; +use Hyperf\Stringable\Str; +use Singularity\HDK\Core\Service\ExtendService; + +trait RestfulList +{ + #[Inject] + private ExtendService $extend; + #[Inject] + private RequestInterface $request; + + public function restSelect(Closure $callback, ?Closure $filter = null) + { + $options = []; + $result = $this->parseParameters(function ($query, $parsedOptions) use ($callback, &$options) { + $options = $parsedOptions; + $callback($query, $parsedOptions); + }); + return $this->responseFormatter($options, $result, $filter); + } + + public function parseParameters(Closure $callback): mixed + { + $query = $this->request->getQueryParams(); + $options = [ + 'size' => $this->request->query('size'), + 'page' => $this->request->query('page'), + 'order' => $this->request->query('order', 'created_at'), + 'sort' => $this->request->query('sort', 'desc'), + 'group' => $this->request->query('group'), + 'extends' => $this->extend->getExtends(), + ]; + unset($query['sort'], $query['page'], $query['size'], $query['order'], $query['group'], $query['extends']); + return $callback(query: $query, options: $options); + } + + public function responseFormatter( + array $options, + Builder $builder, + ?Closure $filter = null + ) { + $perPage = $options['size'] ?? null; + $order = $options['order'] ?? 'created_at'; + $sort = $options['sort'] ?? 'desc'; + $pagination = !!($options['page'] ?? $perPage ?? false); + // $group = $options['group'] ?? null; + + $builder = $builder->orderBy(Str::snake($order), $sort); + $result = $pagination ? $builder->paginate($perPage) : $builder->get(); + + if (is_null($filter)) { + return $result; + } + + if ($result instanceof LengthAwarePaginatorInterface) { + $collection = $result->getCollection(); + $collection = $filter($collection); + + return $result->setCollection($collection); + } + return $filter($result); + } +} \ No newline at end of file