2020-11-02 22:45:37 +08:00
|
|
|
<?php
|
2020-12-02 17:15:32 +08:00
|
|
|
/*
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
| Common function method
|
|
|
|
|--------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
2020-11-02 22:45:37 +08:00
|
|
|
use Hyperf\Contract\StdoutLoggerInterface;
|
2021-09-15 21:52:20 +08:00
|
|
|
use Hyperf\Database\Query\Builder as QueryBuilder;
|
|
|
|
use Hyperf\Database\Model\Builder as ModelBuilder;
|
2020-11-02 22:45:37 +08:00
|
|
|
use Hyperf\HttpServer\Contract\ResponseInterface;
|
|
|
|
use Hyperf\Logger\LoggerFactory;
|
|
|
|
use Hyperf\Server\ServerFactory;
|
|
|
|
use Hyperf\Utils\ApplicationContext;
|
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
|
|
use Swoole\Websocket\Frame;
|
|
|
|
use Swoole\WebSocket\Server as WebSocketServer;
|
2020-11-07 22:57:10 +08:00
|
|
|
use Hyperf\Utils\Str;
|
2020-11-08 17:10:05 +08:00
|
|
|
use Hyperf\Redis\Redis;
|
2021-08-10 21:35:41 +08:00
|
|
|
use Psr\Container\ContainerInterface;
|
|
|
|
use Psr\Log\LoggerInterface;
|
2020-11-02 22:45:37 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 容器实例
|
2020-12-02 17:15:32 +08:00
|
|
|
*
|
2021-08-10 21:35:41 +08:00
|
|
|
* @return ContainerInterface
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2021-08-10 21:35:41 +08:00
|
|
|
function di(): ContainerInterface
|
2020-11-07 22:57:10 +08:00
|
|
|
{
|
|
|
|
return ApplicationContext::getContainer();
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Redis 客户端实例
|
2020-12-02 17:15:32 +08:00
|
|
|
*
|
|
|
|
* @return Redis|mixed
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function redis()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(Redis::class);
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-12-03 16:22:55 +08:00
|
|
|
* Server 实例 基于 Swoole Server
|
2020-11-29 14:44:11 +08:00
|
|
|
*
|
|
|
|
* @return \Swoole\Coroutine\Server|\Swoole\Server
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function server()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(ServerFactory::class)->getServer()->getServer();
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-12-03 16:22:55 +08:00
|
|
|
* WebSocket frame 实例
|
|
|
|
*
|
|
|
|
* @return mixed|Frame
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function frame()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(Frame::class);
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-12-03 16:22:55 +08:00
|
|
|
* WebSocketServer 实例
|
|
|
|
*
|
|
|
|
* @return mixed|WebSocketServer
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function websocket()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(WebSocketServer::class);
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 缓存实例 简单的缓存
|
2020-12-03 16:22:55 +08:00
|
|
|
*
|
|
|
|
* @return mixed|\Psr\SimpleCache\CacheInterface
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function cache()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(Psr\SimpleCache\CacheInterface::class);
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
2021-07-10 10:55:25 +08:00
|
|
|
/**
|
|
|
|
* Dispatch an event and call the listeners.
|
2021-09-04 19:13:25 +08:00
|
|
|
*
|
|
|
|
* @return mixed|\Psr\EventDispatcher\EventDispatcherInterface
|
2021-07-10 10:55:25 +08:00
|
|
|
*/
|
|
|
|
function event()
|
|
|
|
{
|
2021-09-04 19:13:25 +08:00
|
|
|
return di()->get(Psr\EventDispatcher\EventDispatcherInterface::class);
|
2021-07-10 10:55:25 +08:00
|
|
|
}
|
|
|
|
|
2020-11-02 22:45:37 +08:00
|
|
|
/**
|
|
|
|
* 控制台日志
|
2020-12-03 16:22:55 +08:00
|
|
|
*
|
|
|
|
* @return StdoutLoggerInterface|mixed
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function stdout_log()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(StdoutLoggerInterface::class);
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 文件日志
|
2020-11-29 14:44:11 +08:00
|
|
|
*
|
|
|
|
* @param string $name
|
2021-08-10 21:35:41 +08:00
|
|
|
* @return LoggerInterface
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2021-08-10 21:35:41 +08:00
|
|
|
function logger(string $name = 'APP'): LoggerInterface
|
2020-11-07 22:57:10 +08:00
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(LoggerFactory::class)->get($name);
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-12-02 17:15:32 +08:00
|
|
|
* Http 请求实例
|
|
|
|
*
|
|
|
|
* @return mixed|ServerRequestInterface
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function request()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(ServerRequestInterface::class);
|
2020-11-02 22:45:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 请求响应
|
2020-12-02 17:15:32 +08:00
|
|
|
*
|
|
|
|
* @return ResponseInterface|mixed
|
2020-11-02 22:45:37 +08:00
|
|
|
*/
|
2020-11-07 22:57:10 +08:00
|
|
|
function response()
|
|
|
|
{
|
2021-07-23 21:34:29 +08:00
|
|
|
return di()->get(ResponseInterface::class);
|
2020-11-04 16:47:17 +08:00
|
|
|
}
|
|
|
|
|
2020-11-05 17:40:51 +08:00
|
|
|
/**
|
2021-09-04 19:13:25 +08:00
|
|
|
* 获取邮件助手
|
2020-12-03 11:57:46 +08:00
|
|
|
*
|
2021-09-04 20:18:20 +08:00
|
|
|
* @return \App\Support\Mailer|mixed
|
2020-11-05 17:40:51 +08:00
|
|
|
*/
|
2021-09-04 19:13:25 +08:00
|
|
|
function email()
|
2020-11-05 17:40:51 +08:00
|
|
|
{
|
2021-09-04 20:18:20 +08:00
|
|
|
return di()->get(App\Support\Mailer::class);
|
2020-11-05 17:40:51 +08:00
|
|
|
}
|
2020-11-07 22:57:10 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取媒体文件url
|
|
|
|
*
|
|
|
|
* @param string $path 文件相对路径
|
|
|
|
* @return string
|
|
|
|
*/
|
2021-09-04 19:13:25 +08:00
|
|
|
function get_media_url(string $path): string
|
2020-11-07 22:57:10 +08:00
|
|
|
{
|
2021-04-22 16:14:34 +08:00
|
|
|
return sprintf('%s/%s', rtrim(config('domain.img_url'), '/'), ltrim($path, '/'));
|
2020-11-07 22:57:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 随机生成图片名
|
|
|
|
*
|
2021-06-30 19:27:49 +08:00
|
|
|
* @param string $ext 图片后缀名
|
|
|
|
* @param array $filesize 图片文件大小信息
|
2020-11-07 22:57:10 +08:00
|
|
|
* @return string
|
|
|
|
*/
|
2021-08-10 21:35:41 +08:00
|
|
|
function create_image_name(string $ext, array $filesize): string
|
2020-11-07 22:57:10 +08:00
|
|
|
{
|
2021-06-30 19:27:49 +08:00
|
|
|
return uniqid() . Str::random() . '_' . $filesize[0] . 'x' . $filesize[1] . '.' . $ext;
|
2020-11-08 17:10:05 +08:00
|
|
|
}
|
2020-11-09 22:59:25 +08:00
|
|
|
|
2020-11-29 17:39:24 +08:00
|
|
|
/**
|
|
|
|
* 判断0或正整数
|
|
|
|
*
|
2021-05-24 11:31:36 +08:00
|
|
|
* @param string|int $value 验证字符串
|
|
|
|
* @param bool $isZero 判断是否可为0
|
2020-11-29 17:39:24 +08:00
|
|
|
* @return bool
|
|
|
|
*/
|
2021-09-04 19:13:25 +08:00
|
|
|
function check_int($value, $isZero = false): bool
|
2020-11-29 17:39:24 +08:00
|
|
|
{
|
|
|
|
$reg = $isZero ? '/^[+]{0,1}(\d+)$/' : '/^[1-9]\d*$/';
|
2021-05-24 11:31:36 +08:00
|
|
|
return is_numeric($value) && preg_match($reg, $value);
|
2020-11-29 17:39:24 +08:00
|
|
|
}
|
|
|
|
|
2020-12-02 17:15:32 +08:00
|
|
|
/**
|
|
|
|
* 解析英文逗号',' 拼接的 ID 字符串
|
|
|
|
*
|
2021-05-24 11:31:36 +08:00
|
|
|
* @param string|int $ids 字符串(例如; "1,2,3,4,5,6")
|
2020-12-02 17:15:32 +08:00
|
|
|
* @return array
|
|
|
|
*/
|
2021-09-04 19:13:25 +08:00
|
|
|
function parse_ids($ids): array
|
2020-11-29 17:39:24 +08:00
|
|
|
{
|
|
|
|
return array_unique(explode(',', trim($ids)));
|
|
|
|
}
|
2021-05-13 18:01:34 +08:00
|
|
|
|
2021-07-07 19:43:09 +08:00
|
|
|
/**
|
|
|
|
* 推送消息到 Redis 订阅中
|
|
|
|
*
|
|
|
|
* @param string $chan
|
|
|
|
* @param string|array $message
|
|
|
|
*/
|
|
|
|
function push_redis_subscribe(string $chan, $message)
|
|
|
|
{
|
|
|
|
redis()->publish($chan, is_string($message) ? $message : json_encode($message));
|
|
|
|
}
|
|
|
|
|
2021-06-30 19:27:49 +08:00
|
|
|
/**
|
|
|
|
* 生成随机文件名
|
|
|
|
*
|
|
|
|
* @param string $ext 文件后缀名
|
|
|
|
* @return string
|
|
|
|
*/
|
2021-08-10 21:35:41 +08:00
|
|
|
function create_random_filename(string $ext): string
|
2021-06-30 19:27:49 +08:00
|
|
|
{
|
|
|
|
$ext = $ext ? '.' . $ext : '';
|
|
|
|
return Str::random(10) . uniqid() . $ext;
|
|
|
|
}
|
2021-09-12 16:23:43 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取客户端你真实IP
|
|
|
|
*
|
|
|
|
* @return mixed|string
|
|
|
|
*/
|
|
|
|
function get_real_ip(): string
|
|
|
|
{
|
|
|
|
if ($ip = request()->getHeaderLine('x-real-ip')) {
|
|
|
|
return $ip;
|
|
|
|
} else if ($ip = request()->getHeaderLine('x-forwarded-for')) {
|
|
|
|
return $ip;
|
|
|
|
}
|
|
|
|
|
|
|
|
return request()->getServerParams()['remote_addr'] ?? '';
|
|
|
|
}
|
2021-09-15 21:52:20 +08:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 通过查询构造器读取分页数据
|
|
|
|
*
|
|
|
|
* @param QueryBuilder|ModelBuilder $model 查询构造器
|
|
|
|
* @param array $fields 查询字段
|
|
|
|
* @param int $page 当前分页
|
|
|
|
* @param int $size 分页大小
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
function toPaginate($model, array $fields = ['*'], int $page = 1, int $size = 15): array
|
|
|
|
{
|
|
|
|
$total = $model->count();
|
|
|
|
|
|
|
|
$data = [
|
|
|
|
'rows' => [],
|
|
|
|
'paginate' => [
|
|
|
|
'page' => $page,
|
|
|
|
'size' => $size,
|
|
|
|
'total' => $total,
|
|
|
|
]
|
|
|
|
];
|
|
|
|
|
|
|
|
if ($total > 0) $data['rows'] = $model->forPage($page, $size)->get($fields)->toArray();
|
|
|
|
|
2021-09-16 22:41:36 +08:00
|
|
|
if ($data['rows'] && $model instanceof QueryBuilder) {
|
|
|
|
foreach ($data['rows'] as &$row) {
|
|
|
|
$row = (array)$row;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-15 21:52:20 +08:00
|
|
|
return $data;
|
|
|
|
}
|