Dux Next 基础框架了常用类库的加载,使用时无需去实例化类,框架会自动进行初始化和依赖注入,并且返回原类对象,拥有完整的代码提示与类库文档。
除了通过 app.yaml
配置外,您可以在入口文件中 run()
方法执行前调用该方法进行加载应用入口类。
\Dux\App::registerApp(array $class)
使用配置类可以方便地读取和修改配置文件。它封装了 noodlehaus/config
类库中的加载。
// 配置实例
$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秒
该类使用 PHP-DI
作为容器类,同时建议在应用入口中的 init
方法内进行注册依赖。
// 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
验证规则参数与示例如下:
// 不含附加规则情况
"字段名" => ["规则名", "提示信息"]
// 含附加规则情况
"字段名" => ["规则名", "规则参数", "提示信息"]
\Dux\App::validator([], [
// 预设验证
"name" => ["required", "请输入名称"],
// 自定义验证
"title" => [function($field, $value, $params, $fields) {
return false;
}, '自定义验证失败'],
// 多条件验证
"num" => [
["required", "请输入数字"],
["min", 1, "不能小于 1"],
["max", 100, "不能大于 100"],
],
])
Read more in validator Docs
返回一个 Data
对象,可以通过对象方法
取出传递进去的验证数据。
如果数据验证失败,则会抛出异常 ExceptionValidator
,其中包含了验证失败的消息与字段,无需拦截该异常由接口调用方处理。
以下是一个使用示例:
$source = [
"score" => 6,
"content" => "评价内容"
];
$rule = [
"score#1" => ["min", 1, "评分太低"],
"score#2" => ["min", 5, "评分太高"],
"content" => ['required', '请输入评价内容']
];
\Dux\App::validator($source, $rule);
调用该方法返回实例化后的 Eloquent ORM
对象。
获取 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");
返回的 $log
为 Monolog\Logger
类的实例化对象,可通过调用对象中的方法,写入不同级别的日志:
// 写入 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 = "");
可以通过以上方法创建一个队列实例。接着,可以使用以下方法将任务添加到队列中:
$queue
->add(string $class, string $method = "", array $params = [])
->delay(int $second)
->send();
type required string
default
队列类型,可自定义 通过守护使用以下命令运行默认类型
队列:
可以执行多个队列命令来实现并发效果,并且多个队列之间不会重复执行同一任务。
系统使用 nette/latte
作为 PHP 视图。您可以使用视图类,将PHP渲染为模板,并输出给用户。对于普通网站来说,这非常有用。
// $name 为缓存名,代表该模板组的缓存目录
$view = \Dux\App::view(string $name = "");
// 返回渲染后字符串,可通过路由回调进行输出
$html = $view->renderToString(dirname(__DIR__) . "/home.html", [
"title" => "标题",
]);
以下为模板文件
最终会渲染为
有关模板标签的详细信息,请查看详细文档。
系统使用 league/flysystem
作为文件存储类,利用不同的驱动可将文件上传至本地服务器或者七牛云等云存储。
$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);
Read more in Storage Docs
Redis类会自动使用 php 扩展或者 predis 类,框架仅做实例化配置的封装与连接,该方法返回一个 Redis
的实例:
$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');
Read more in Storage Docs
部分路由没有进行中间件权限认证,但前端传递了 Authorization
头,则可通过该方式获取授权信息。
\Dux\App::auth('admin')->user($request);
框架使用 peppeocchi/php-cron-scheduler
库作为基础库,并实现了简单的封装,使用时需要在应用入口的 register
方法中进行添加任务,如下:
// 定义一个每分钟执行的任务
\Dux\App::scheduler()->add('* * * * *', function($arg) {
echo $arg;
}, ['test']);
定义后在终端中执行如下命令,则可启动队列:
Read more in Scheduler Docs
在并发场景下容易出现多个业务同时操作一件事项,会导致商品超库存、用户重复注册等问题,使用业务锁的等待机制即可处理该问题。
$lock = \Dux\App::lock($type = 'semaphore')->createLock('test');
// 锁定资源并等待可用
if ($lock->acquire(true)) {
// 可安全实现业务逻辑
...
// 释放锁定
$lock->release();
}
根据不同的业务场景可选择 semaphore
、flock
、redis
作为锁的依赖数据,达到分布式锁的目的。
根据 IP 地址获取 IP 所在的国家、省市区等信息,该方法使用 ip2region
库作为基础,使用前需要在配置文件 geo.yaml
配置 IP 库的路径,请自行下载 IP 库。
$result = \Dux\App::geo()->simple('0.0.0.0');
print_r($result);