类库
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);