mirror of
http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore.git
synced 2026-01-15 07:35:08 +08:00
80 lines
2.5 KiB
PHP
80 lines
2.5 KiB
PHP
<?php
|
|
/**
|
|
* Paginatable.php@Core
|
|
*
|
|
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
|
* 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]
|
|
protected ExtendService $extend;
|
|
#[Inject]
|
|
protected RequestInterface $request;
|
|
|
|
protected function restSelect(Closure $callback, ?Closure $filter = null)
|
|
{
|
|
$parsed_options = [];
|
|
$result = $this->parseParameters(
|
|
callback: function ($query, $options) use ($callback, &$parsed_options) {
|
|
$parsed_options = $options;
|
|
return $callback($query, $options);
|
|
}
|
|
);
|
|
return $this->responseFormatter($parsed_options, $result, $filter);
|
|
}
|
|
|
|
protected 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);
|
|
}
|
|
|
|
protected 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);
|
|
}
|
|
} |