类库
DuxLite 封装了常用类库的加载,使用时无需去实例化类,框架会自动进程初始化和依赖注入,并且返回原类对象,拥有完整的代码提示与类库文档。
注册应用
除了通过 app.yaml
配置外,您可以在入口文件中 run()
方法执行前调用该方法进行加载应用入口类。
\Dux\App::registerApp(array $class)
\Dux\App::registerApp(array $class)
配置类
使用配置类可以方便地读取和修改配置文件。它封装了 noodlehaus/config 类库中的加载。
$name
为 config 目录下的 yaml 配置文件名app.name
为多级结构,可通过.
来获取任意级别配置项
// 配置实例
$config = \Dux\App::config(string $name);
// 读取配置项
$config->get('app.name');
// 设置配置项
$config->set('app.name', 'test');
// 配置实例
$config = \Dux\App::config(string $name);
// 读取配置项
$config->get('app.name');
// 设置配置项
$config->set('app.name', 'test');
针对一些特殊的使用可以在值内使用 %base_path%
代表当前项目路径。
缓存类
使用该类可设置和获取缓存数据,该类使用 phpfastcache 作为类库,返回 Psr-16 标准的方法。
// 缓存实例
$cache = \Dux\App::cache();
// 读取缓存
$config->get('test-key');
// 设置缓存
$config->set('test-key', 'lorem ipsum', 300); // 300秒
// 缓存实例
$cache = \Dux\App::cache();
// 读取缓存
$config->get('test-key');
// 设置缓存
$config->set('test-key', 'lorem ipsum', 300); // 300秒
依赖注入
该类使用 PHP-DI 作为容器类,同时建议在应用入口中的 init
方法内进行注册依赖。
// DI 实例
$di = \Dux\App::di();
// 设置对象到容器
$di->set(Test::class, new Test());
// 从容器获取对象
$di->get(Test::class);
// DI 实例
$di = \Dux\App::di();
// 设置对象到容器
$di->set(Test::class, new Test());
// 从容器获取对象
$di->get(Test::class);
数据验证
该类使用 vlucas/valitron 作为验证器,并封装了一个验证方法,使得传递数组即可轻松验证任意数据。
/**
* 对传入的数据进行验证,如果有任何验证错误则会抛出验证失败的异常 ExceptionValidator
*
* @param array $data 需要验证的数据
* @param array $rules 验证规则
* @return void
* @throws ExceptionValidator 验证失败时抛出的异常
*/
\Dux\App::validator(array $data, array $rules): Data
/**
* 对传入的数据进行验证,如果有任何验证错误则会抛出验证失败的异常 ExceptionValidator
*
* @param array $data 需要验证的数据
* @param array $rules 验证规则
* @return void
* @throws ExceptionValidator 验证失败时抛出的异常
*/
\Dux\App::validator(array $data, array $rules): Data
参数说明:
$data
需要验证的数据,应该是一个键值对数组。$rules
验证规则,应该是一个键值对数组,其中键为需要验证的字段名,值为验证规则数组。规则中最后一个元素代表失败消息,之前为验证规则。
返回值:
- 返回一个
Data
对象,可以通过对象方法取出传递进去的验证数据。
异常说明:
- 如果数据验证失败,则会抛出异常 ExceptionValidator,其中包含了验证失败的消息与字段,无需拦截该异常直接返回前端处理。
以下是一个使用示例:
$source = [
"score" => 6,
"content" => "评价内容"
];
$rule = [
"score#1" => ["min", 1, "评分太低"],
"score#2" => ["min", 5, "评分太高"],
"content" => ['required', '请输入评价内容']
];
\Dux\App::validator($source, $rule);
$source = [
"score" => 6,
"content" => "评价内容"
];
$rule = [
"score#1" => ["min", 1, "评分太低"],
"score#2" => ["min", 5, "评分太高"],
"content" => ['required', '请输入评价内容']
];
\Dux\App::validator($source, $rule);
ORM对象
调用该方法返回实例化后的 Eloquent
对象,更多使用文档请查看 数据库查询
获取 DB 对象
$db = \Dux\App::db();
// 开启事务
\Dux\App::db()->getConnection()->beginTransaction();
// 提交事务
\Dux\App::db()->getConnection()->commit();
// 回滚事务
\Dux\App::db()->getConnection()->rollBack();
获取 DB 对象
$db = \Dux\App::db();
// 开启事务
\Dux\App::db()->getConnection()->beginTransaction();
// 提交事务
\Dux\App::db()->getConnection()->commit();
// 回滚事务
\Dux\App::db()->getConnection()->rollBack();
该方法返回 Eloquent 对象,可以进行数据库查询操作,也可以使用 getConnection
方法获取连接对象,从而实现事务操作。
日志类
日志使用 Seldaek/monolog 作为日志系统:
/**
* 获取日志实例
*
* @param string $app 日志文件存放的文件名称
* @return \Monolog\Logger 日志类实例
*/
$log = \Dux\App::log(string $app = "default");
/**
* 获取日志实例
*
* @param string $app 日志文件存放的文件名称
* @return \Monolog\Logger 日志类实例
*/
$log = \Dux\App::log(string $app = "default");
返回的 $log
为 Monolog\Logger
类的实例化对象,具体使用方式可以参考 Seldaek/monolog 的文档。
此外,可通过调用 Monolog\Logger
对象中的方法,写入不同级别的日志:
// 写入 Debug 日志
$db->debug('Debug message');
// 写入 Info 日志
$db->info('Info message');
// 写入 Error 日志
$db->error('Error message');
// 写入 Debug 日志
$db->debug('Debug message');
// 写入 Info 日志
$db->info('Info message');
// 写入 Error 日志
$db->error('Error message');
队列类
框架提供了一个队列类来实现队列管理,该类基于 Enqueue/Redis 实现,并对其进行了二次封装。
使用队列类需要先调用以下方法来创建队列实例:
// $type 为队列类型,目前暂时只支持 Redis,并且默认为redis
$queue = \Dux\App::queue(string $type = "");
// $type 为队列类型,目前暂时只支持 Redis,并且默认为redis
$queue = \Dux\App::queue(string $type = "");
可以通过以上方法创建一个队列实例。接着,可以使用以下方法将任务添加到队列中:
$group = 'default';
$queue
->add(string $class, string $method = "", array $params = [])
->delay(int $second)
->send();
$group = 'default';
$queue
->add(string $class, string $method = "", array $params = [])
->delay(int $second)
->send();
通过以上方法,可以将任务添加到队列中。$class 是回调类名,$method 是回调方法,$params 是回调参数,$second 是延迟时间(以秒为单位)。
接着,可以使用以下命令运行队列:
#运行默认队列
./dux queue
#运行默认队列
./dux queue
可以使用守护进程执行多个队列命令来实现并发效果,并且多个队列之间不会重复执行同一任务。
视图类
该框架使用 nette/latte 作为 PHP 视图。您可以使用视图类,将PHP渲染为模板,并输出给用户。对于CMS网站来说,这非常有用。
// $name 为缓存名,代表该模板组的缓存目录
$view = \Dux\App::view(string $name = "");
// 返回渲染后字符串,可通过路由回调进行输出
$html = $view->renderToString(dirname(__DIR__) . "/home.html", [
"title" => "标题",
]);
// $name 为缓存名,代表该模板组的缓存目录
$view = \Dux\App::view(string $name = "");
// 返回渲染后字符串,可通过路由回调进行输出
$html = $view->renderToString(dirname(__DIR__) . "/home.html", [
"title" => "标题",
]);
以下为模板文件
<h1>{$title}</h1>
<h1>{$title}</h1>
最终会渲染为
<h1>标题</h1>
<h1>标题</h1>
有关模板标签的详细信息,请查看 nette/latte 文档。
文件存储类
框架使用 league/flysystem 作为文件存储类,利用不同的驱动可将文件上传至本地服务器或者七牛云等云存储。
$storage = \Dux\App::storage(string $type = "");
$storage = \Dux\App::storage(string $type = "");
如果不指定 $type
,则将使用配置文件中默认的驱动程序。此方法返回 Filesystem
类的一个实例,用于处理文件。以下是该类中一些常用的方法:
// 将文件写入文件系统中。其中 $path 表示文件路径,$contents 表示文件内容。
$storage->write($path, $contents);
// 将指定的文件流写入文件系统中。其中 $path 表示文件路径,$resource 表示文件流。
$storage->writeStream($path, $resource);
// 读取文件系统中指定的文件。其中 $path 表示文件路径。
$storage->read($path);
// 将指定的文件读取到文件流中。其中 $path 表示文件路径。
$storage->readStream($path);
// 删除文件系统中指定的文件。其中 $path 表示文件路径。
$storage->delete($path);
// 获取文件在文件系统中的 URL。其中 $path 表示文件路径。
$storage->getUrl($path);
// 将文件写入文件系统中。其中 $path 表示文件路径,$contents 表示文件内容。
$storage->write($path, $contents);
// 将指定的文件流写入文件系统中。其中 $path 表示文件路径,$resource 表示文件流。
$storage->writeStream($path, $resource);
// 读取文件系统中指定的文件。其中 $path 表示文件路径。
$storage->read($path);
// 将指定的文件读取到文件流中。其中 $path 表示文件路径。
$storage->readStream($path);
// 删除文件系统中指定的文件。其中 $path 表示文件路径。
$storage->delete($path);
// 获取文件在文件系统中的 URL。其中 $path 表示文件路径。
$storage->getUrl($path);
有关更多方法和使用说明,请参阅api文档
Redis类
Redis类为php扩展,框架仅做实例化配置的封装与连接,具体使用方法参考 php-redis
该方法返回一个 Redis
的实例
$storage = \Dux\App::redis(int $database = 0, string $name = "default");
$storage = \Dux\App::redis(int $database = 0, string $name = "default");
其中 $database
为数据库编号,$name
为在配置文件中指定的 Redis
配置名称。
以下为常用的 Redis 方法示例:
// 设置 Redis 的 key 值
$redis->set('key', 'value');
// 获取 Redis 的 key 值
$value = $redis->get('key');
// 删除 Redis 的 key 值
$redis->del('key');
// 判断 Redis 的 key 值是否存在
$exists = $redis->exists('key');
// 设置 Redis 的 key 值
$redis->set('key', 'value');
// 获取 Redis 的 key 值
$value = $redis->get('key');
// 删除 Redis 的 key 值
$redis->del('key');
// 判断 Redis 的 key 值是否存在
$exists = $redis->exists('key');
用户授权
部分路由没有进行中间件权限认证,但前端传递了 Authorization
头,则可通过该方式获取授权信息。
\Dux\App::auth('admin')->user($request);
\Dux\App::auth('admin')->user($request);
计划任务
框架使用 peppeocchi/php-cron-scheduler
库作为计划任务库,并实现了简单的封装,使用时需要在应用入口的 register
方法中进行添加任务,如下:
// 定义一个每分钟执行的任务
\Dux\App::scheduler()->add('* * * * *', function($arg) {
echo $arg;
}, ['test']);
// 定义一个每分钟执行的任务
\Dux\App::scheduler()->add('* * * * *', function($arg) {
echo $arg;
}, ['test']);
定义后在终端中执行如下命令,则可启动队列:
./dux scheduler
./dux scheduler
计划任务
框架使用 peppeocchi/php-cron-scheduler
库作为计划任务库,并实现了简单的封装,使用时需要在应用入口的 register
方法中进行添加任务,如下:
// 定义一个每分钟执行的任务
\Dux\App::scheduler()->add('* * * * *', function($arg) {
echo $arg;
}, ['test']);
// 定义一个每分钟执行的任务
\Dux\App::scheduler()->add('* * * * *', function($arg) {
echo $arg;
}, ['test']);
定义后在终端中执行如下命令,则可启动队列:
./dux scheduler
./dux scheduler
业务锁
在并发场景下容易出现多个业务同时操作一件事项,会导致商品超库存、用户重复注册等问题,使用业务锁的等待机制即可处理该问题。
$lock = \Dux\App::lock($type = 'semaphore')->createLock('test');
// 锁定资源并等待可用
if ($lock->acquire()) {
// 可安全实现业务逻辑
...
// 释放锁定
$lock->release();
}
$lock = \Dux\App::lock($type = 'semaphore')->createLock('test');
// 锁定资源并等待可用
if ($lock->acquire()) {
// 可安全实现业务逻辑
...
// 释放锁定
$lock->release();
}
根据不同的业务场景可选择 semaphore
、flock
、redis
作为锁的依赖数据,业务锁使用Symfony/Lock,可查看文档使用更多方法如超时等设置。
地理位置获取
根据 IP 地址获取 IP 所在的国家、省市区等信息,该方法使用 GeoIp2 库作为封装,使用前需要在配置文件 geo.yaml
配置 IP 库的路径,请自行下载 IP 库。
$result = \Dux\App::geo()->city('0.0.0.0');
print_r($result);
$result = \Dux\App::geo()->city('0.0.0.0');
print_r($result);