欢迎来到PHP微框架Wei的文档.这里将为您展示丰富全面的代码指导和案例.
Wei是一个PHP微框架,提供了强大又简洁的接口,让PHP开发更快速,更简单.
Wei的使用比任何框架都要简单,只需3步,加载
=>创建
=>调用
!
// 1. 加载核心类文件
require 'path/to/wei/lib/Wei/Wei.php';
// 2. 创建对象管理器对象
$wei = wei(array(
// 对象管理器选项
'wei' => array(
'debug' => true,
// 其他选项...
),
// 数据库选项
'db' => array(
'driver' => 'mysql',
'host' => 'localhost',
'dbname' => 'wei',
'charset' => 'utf8',
'user' => 'root',
'password' => 'xxxxxx',
),
// 更多选项...
));
// 3. 调用"db"对象执行SQL查询
$result = $wei->db->fetch("SELECT 1 + 2");
{
"require": {
"wei/wei": "0.9.9"
}
}
微框架每天都有新的提交,欢迎关注,了解最新趋势!
提供了上百个各具特色的对象,包括缓存,数据库操作,验证器,HTTP请求,HTTP响应等
对象管理器,所有对象的入口.
用于获取服务对象,设置自动加载,设置别名,设置配置等.
/* @var $wei \Wei\Wei */
$wei = wei();
在微框架中,我们将提供功能的对象称为"服务",如缓存服务(cache),数据库服务(db).
获取服务对象使用wei()->服务名称
即可.
// 获取数据库操作服务
$db = wei()->db;
// 获取redis缓存服务
$redis = wei()->redis;
// 使用验证服务检查数据
$validator = wei()->validate(array());
对象配置可以通过wei函数的第一个参数来设置,
完整配置请查看配置章节.
$wei = wei(array(
// 类`Wei\Wei`的属性值
'wei' => array(
'debug' => true,
),
// 类`Wei\Db`的属性值
'db' => array(
'driver' => 'mysql',
'host' => 'localhost',
'dbname' => 'wei',
'charset' => 'utf8',
'user' => 'root',
'password' => '123456',
)
));
微框架支持PRS-0风格的类自动加载器.
wei(array(
'wei' => array(
// 启用自动加载
'autoload' => true,
// 设置自动加载的类的命名空间和类所在的目录
'autoloadMap' => array(
'命名空间' => '类所在路径',
'MyLib' => 'path/to/lib',
'MyProject' => 'path/to/project',
'MyClass\Module' => 'path/to/class',
// 将未在上面指定命名空间的类,都引导到library目录下
'' => 'path/to/library'
)
)
));
// 检查类是否正确加载
// => 检查文件 path/to/library/MyNamesapce/MyClass.php 是否存在
var_dump(class_exists('MyNamesapce\MyClass'));
// => 检查文件 path/to/library/MyClass/MyClass.php 是否存在
var_dump(class_exists('MyClass\MyClass'));
错误调试可通过debug
选项开启,PHP的调试可通过inis
选项配置
注意: 两者的配置相互独立,不互相影响
wei(array(
'wei' => array(
// 开启调试模式
'debug' => true,
// 通过PHP ini配置,开启PHP错误信息提示
'inis' => array(
// 在屏幕上输出错误信息
'display_errors' => true,
// 设置错误报告的级别
'error_reporting' => -1,
),
)
));
PHP的配置可以通过inis
选项来设置.
wei(array(
'wei' => array(
'inis' => array(
'date.timezone' => 'Asia/Shanghai', // 设置时区为上海
'memory_limit' => '128M', // 设置最大限制为128M
'post_max_size' => '8M', // 设置POST请求的最大数据限制
'session.name' => 'PHPSESSID', // 设置Session的cookie名称
'ini配置名称' => 'ini配置的值',
)
)
));
aliases
选项加载自定义服务除了系统自带的对象之外,你也可以自定义对象类.
定义您的类,继承于\Wei\Base
namespace MyProject;
class Application extends \Wei\Base
{
public function run()
{
// do something
}
}
设置aliases
选项,指定您的类所作为的服务名称
wei(array(
'wei' => array(
'aliases' => array(
'服务名称' => '类名称',
'app' => 'MyProject\Application'
)
)
));
调用您的对象
// 获取自定义服务
/* @var $app \MyProject\Application */
$app = wei()->app;
// 和平常一样调用类的方法
$app->run();
import
导入目录下的类为服务对象wei(array(
'wei' => array(
'import' => array(
array(
'dir' => '要导入的类文件所在的目录',
'namespace' => '要导入的类文件所在的命名空间',
'format' => '导入后服务的名称格式,%s将被替换为文件名称'
),
array(
'dir' => 'path/to/MyProject',
'namespace' => 'MyProject',
'format' => 'my%s'
)
),
)
));
aliases
和providers
选项aliases
选项数组的key是服务名称,value是类名称providers
选项数组的key是服务名称,value也是服务名称wei(array(
'wei' => array(
'aliases' => array(
'服务名称' => '类名称'
),
'providers' => array(
'服务名称' => '服务名称'
)
)
));
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
debug | bool | true | 是否启用调试模式 |
inis | array | 无 | PHP的ini配置选项 |
autoload | bool | true | 是否启用自动加载 |
autoloadMap | array | 无 | 自动加载的命名空间和路径地址 |
aliases | array | 无 | 服务别名列表 |
import | array | 无 | 导入指定目录下的对象类 |
preload | array | 无 | 预加载的服务列表 |
beforeConstruct | callbale | 无 | 每个对象初始化前的回调 |
afterConstruct | callbale | 无 | 每个对象初始化后的回调 |
名称 | 类型 | 说明 |
---|---|---|
$wei | Wei\Wei | 对象管理器 |
$full | string | 完整的对象名称,包含. 连接符,如db ,user.db
|
$name | string | 对象名称,不包含. 连接符,如db ,request
|
名称 | 类型 | 说明 |
---|---|---|
$wei | Wei\Wei | 对象管理器 |
$full | string | 完整的对象名称,包含. 连接符,如db ,user.db
|
$name | string | 对象名称,不包含. 连接符,如db ,request
|
$object | Wei\Base | 当前初始化的对象 |
获取对象管理器,如果不存在,将创建一个新的对象
返回: Wei\Wei
对象管理器
参数
名称 | 类型 | 说明 |
---|---|---|
$config | string,array | 对象的配置数组或配置文件 |
检查是否启用了调试模式
返回: bool
开启或关闭调试模式
返回: Wei\Wei
对象管理器
参数
名称 | 类型 | 说明 |
---|---|---|
$debug | bool | 是否启用调试 |
设置对象的配置
返回: Wei\Wei
对象管理器
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$name | string | 无 | 对象的名称,如request , request.sub
|
$value | array | 无 | 对象的配置选项 |
设置对象所有配置
返回: Wei\Wei
对象管理器
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$array | array | 无 | 对象的完整配置 |
获取对象的选项配置
返回: mixed
配置的值,如果配置不存在,返回null
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$name | string | 无 | 配置的名称 |
获取一个对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$name | string | 无 | 对象的名称 |
$options | array | 无 | 除了会通过config 方法获取配置选项之外的附加的配置选项 |
$providers | array | 无 | 指定对象的依赖关系 |
导入指定目录下的类文件
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$dir | string | 无 | 类文件所在的目录 |
$namespace | string | 无 | 类名对应的命名空间 |
$format | string | 无 | 类文件的格式 |
初始化一个新的对象
设置对象
移除对象,如果对象存在,返回true
,否则返回false
根据对象名称获取对象类名
检查对象是否存在
启用或禁用PSR-0类自动加载
缓存数据服务,可设定Memcached,Redis,APC,文件等作为缓存驱动
// 设置缓存,成功返回true,失败返回false
wei()->cache('key', 'value');
// 获取缓存,返回'value'
wei()->cache('key');
wei()->cache('key', 'value', 60);
Redis
wei(array(
// 配置缓存驱动为`redis`
'cache' => array(
'driver' => 'redis'
),
// 配置redis的服务器地址
'redis' => array(
'host' => '127.0.0.1',
)
));
// 获取缓存对象
$cache = wei()->cache;
// 输出缓存驱动, 输出为`redis`
echo $cache->getDriver();
如缓存用户总数,每30秒缓存过期,并重新拉取
$totalUsers = wei()->cache->get('totalUsers', 30, function($wei){
return $wei->db->fetchColumn("SELECT COUNT(1) FROM user");
});
将用户编号和最后更新时间作为缓存键名,省略过期时间参数
$user = array(
'id' => 1,
'updateTime' => '2013-12-01 12:00:00'
);
wei()->cache->get($user['id'] . $user['updateTime'], function($wei){
// 渲染复杂的视图,拉取远程接口等耗时较长的操作
return $wei->view->render('userInfo.php');
});
设置文章访问次数增加1,返回增加后的总次数
$hits = wei()->cache->incr('article-1', 1);
echo '该文章已被访问' . $hits . '次';
注意
您无需预先判断该键名的缓存是否存在,如果缓存不存在,将自动从0开始计算
有些时候,我们会在多个应用中,共享同一个memcched服务,共享同一个APC,这时可以通过设置键名前缀,来避免数据冲突
// 设置memcached缓存的键名前缀
wei(array(
'memcached' => array(
'prefix' => 'project-'
)
));
// 缓存键名将自动转换为'project-key'
wei()->memcached->set('key', 'value');
注意: 目前只有redis
和couchbase
支持原生的批量设置,其他的缓存实际都是通过foreach
语句逐个设置.
$cache = wei()->cache;
// 批量设置缓存
$result = $cache->setMulti(array(
'array' => array(),
'bool' => true,
'float' => 1.2,
'int' => 1,
'null' => null,
'object' => new \stdClass()
));
// 返回结果
$result = array (
'array' => true,
'bool' => true,
'float' => true,
'int' => true,
'null' => true,
'object' => true,
);
// 批量获取缓存
$result = $cache->getMulti(array(
'array',
'bool',
'float',
'int',
'null',
'object'
));
// 返回结果
$result = array (
'array' => array(),
'bool' => true,
'float' => 1.2,
'int' => 1,
'null' => NULL,
'object' => stdClass::__set_state(array()),
);
常用场景
wei()->cache->getFileContent($file, function($file) {
return json_decode(file_get_contents($file), true);
//return \Symfony\Component\Yaml\Yaml::parse($file);
});
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
prefix | string | 无 | 缓存名称的前缀 |
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
driver | string | apc | 缓存的类型 |
特性 | Apc | ArrayCache | DbCache | FileCache | Memecache | Memcached | MongoCache | Couchbase | Redis |
---|---|---|---|---|---|---|---|---|---|
速度 | 快 | 快 | 慢 | 慢 | 快 | 快 | 快 | 快 | 快 |
持久化 | × | - | √ | √ | × | × | √ | √ | √ |
分布式 | × | × | √ | × | √ | √ | √ | √ | √ |
原子性 | √ | √ | × | √ | √ | √ | × | √ | √ |
√
表示支持×
表示不支持-
表示不具备该特性说明:
快
,如果存储在磁盘则慢
add
,replace
,incr
和decr
方法是否为原子操作Cache
和Bicache
为视配置而定,不列入比较ArrayCache
使用PHP数组存储数据,每次请求结束后销毁,因此不具备持久化特性在下面的方法中,cache
表示缓存类的名称,可以替换为其他任意缓存,如redis
, memcached
等
设置缓存的值
返回: bool
是否设置成功
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
$value | mixed | 无 | 缓存的值,允许任意变量类型 |
$expire | int | 0 | 缓存的有效期,默认为0秒,表示永不过期 |
获取指定名称的缓存
返回: mixed
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
设置缓存的值,同cache($key, $value, $expire = 0)
获取缓存的值,同cache($key)
移除一项缓存
返回: bool
缓存存在时返回true
,不存在返回false
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
检查缓存是否存在
返回: bool
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
增加一项缓存,如果缓存已存在,返回false
返回: bool
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
$value | mixed | 无 | 缓存的值,允许任意变量类型 |
$expire | int | 0 | 缓存的有效期,默认为0秒,表示永不过期 |
替换一项缓存,如果缓存不存在,返回false
返回: bool
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
$value | mixed | 无 | 缓存的值,允许任意变量类型 |
增大一项缓存的值
返回: int
增大后缓存的值
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
$offset | int | 1 | 增大的值 |
减小一项缓存的值
返回: int
减小后缓存的值
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$key | string | 无 | 缓存的键名 |
$offset | int | 1 | 减小的值 |
批量获取缓存的值
返回: array
数组的键名是缓存的名称,值是缓存的值,如果某项缓存不存在,它的值为false
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$keys | array | 无 | 缓存的键名数组 |
批量设置缓存的值
返回: array
数组的键名是缓存的名称,值操作结果,即true
和false
参数
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$values | array | 无 | 要缓存的数据 |
清除所有的缓存
返回: bool
注意
该方法会把所有的缓存内容都清空,不仅仅是以$prefix开头的缓存.因为大部分缓存未提供按前缀清空缓存的功能.
根据文件路径和最后修改时间,生成缓存内容
获取键名前缀
设置键名前缀
通过面向对象的方式设置或获取PHP APC缓存,并提供更多友好方便的功能方法.
// 设置缓存,返回true
wei()->apc('key', 'value');
// 获取缓存,返回'value'
wei()->apc('key');
wei()->apc('key', 'value', 60);
更多案例请查看Cache类
无
通用方法请查看Cache类
无
数组缓存,将数据存储在PHP数组中,每次 请求结束 数据就会被 清空.
使用数组缓存主要有两个场景:
// 设置缓存,返回true
wei()->arrayCache('key', 'value');
// 获取缓存,返回'value'
wei()->arrayCache('key');
更多案例请查看Cache类
无
通用方法请查看Cache类
无
设置或获取缓存,数据存储在二级缓存中
二级缓存使用主从同步机制,由一个主缓存(master)和一个从缓存(slave)组成,二级缓存的原理非常简单,有以下两点.
// 设置缓存,返回true
wei()->bicache('key', 'value');
// 获取缓存,返回'value'
wei()->bicache('key');
wei()->bicache('key', 'value', 60);
更多案例请查看Cache类
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
time | int | 5 | 当主缓存写数据时,会检查上次更新到slave缓存的间隔秒数,如果超过该秒数,就同步到从缓存中 |
deps | array | 主从缓存类型的配置 | |
- master | string | apc | 主缓存的类型,推荐使用内存类缓存,如apc,redis,memcache,memcached或couchbase |
- slave | string | fileCache | 从缓存的类型,推荐使用文件类缓存,如fileCache或dbCache |
通用方法请查看Cache类
无
设置或获取一项缓存,缓存数据存储于Couchbase中
// 设置缓存,返回true
wei()->couchbase('key', 'value');
// 获取缓存,返回'value'
wei()->couchbase('key');
wei()->couchbase('key', 'value', 60);
更多案例请查看Cache对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | array | string | 127.0.0.1:8091 |
user | string | 无 | 用于服务器验证的用户名 |
password | string | 无 | 用于服务器验证的密码 |
bucket | string | default | 连接的桶的名称 |
persistent | bool | true | 是否使用长连接 |
通用方法请查看Cache对象
获取原生Couchbase对象
设置原生Couchbase对象
设置或获取一项缓存,缓存数据存储于数据库中
dbCache对象依赖于db对象
// 设置缓存,返回true
wei()->dbCache('key', 'value');
// 获取缓存,返回'value'
wei()->dbCache('key');
wei()->dbCache('key', 'value', 60);
更多案例请查看Cache对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
table | string | cache | 缓存数据表名称 |
通用方法请查看Cache对象
无
设置或获取文件缓存
// 设置缓存,返回true
wei()->fileCache('key', 'value');
// 获取缓存,返回'value'
wei()->fileCache('key');
更多案例请查看Cache对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
dir | string | cache | 缓存文件存储的目录 |
通用方法请查看Cache对象
获取文件缓存的目录
设置文件缓存目录
根据缓存名称获取缓存文件路径
设置或获取一项缓存,缓存数据存储于Memcache中
// 设置缓存,返回true
wei()->memcache('key', 'value');
// 获取缓存,返回'value'
wei()->memcache('key');
wei()->memcache('key', 'value', 60);
更多案例请查看Cache对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
servers | array | 见下表 | 服务器配置数组 |
flag | int | MEMCACHE_COMPRESSED |
用于服务器验证的用户名 |
object | \Memcache | 无 | 原始的Memcache对象 |
servers
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | string | 127.0.0.1 | Memcache服务器地址 |
port | int | 11211 | Memcache服务器端口 |
persistent | bool | true | 是否使用长连接 |
通用方法请查看Cache对象
获取原生Memcache对象
设置原生Memcache对象
设置或获取一项缓存,缓存数据存储于memcached中
// 设置缓存,返回true
wei()->memcached('key', 'value');
// 获取缓存,返回'value'
wei()->memcached('key');
wei()->memcached('key', 'value', 60);
更多案例请查看Cache对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
servers | array | 见下表 | 服务器配置数组 |
object | \Memcached | 无 | 原始的memcached对象 |
servers
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | string | 127.0.0.1 | memcached服务器地址 |
port | int | 11211 | memcached服务器端口 |
通用方法请查看Cache对象
获取原生Memcached对象
设置原生Memcached对象
设置或获取一项缓存,缓存数据存储于MangoDB中
// 设置缓存,返回true
wei()->mongoCache('key', 'value');
// 获取缓存,返回'value'
wei()->mongoCache('key');
wei()->mongoCache('key', 'value', 60);
更多案例请查看Cache对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | string | localhost | MangoDB所在的服务器名称 |
port | int | 27017 | MangoDB所在的服务器的端口 |
db | string | cache | 存储缓存数据的数据库的名称 |
collection | string | cache | 存储缓存数据的集合的名称 |
通用方法请查看Cache对象
无
设置或获取一项缓存,缓存数据存储于Redis中
// 设置缓存,返回true
wei()->redis('key', 'value');
// 获取缓存,返回'value'
wei()->redis('key');
wei()->redis('key', 'value', 60);
更多案例请查看Cache对象
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | string | 127.0.0.1 | Redis所在的服务器名称 |
prot | int | 6379 | Redis所在的服务器端口 |
timeout | float | 0.0 | 连接服务器的超时秒数 |
persistent | bool | true | 是否使用长连接 |
auth | string | 无 | Redis服务器的验证密码 |
object | \Redis | 无 | 原始的Redis对象 |
options | array | - | \Redis::setOption()方法的参数 |
通用方法请查看Cache对象
获取原生Redis对象
设置原生Redis对象
基于PDO的数据库操作对象,支持基本的增删查改(CRUD)和流行的Active Record模式的数据库操作.
目前主要支持MySQL
,SQLite
和PostgreSQL
数据库.
// 插入数据
wei()->db->insert('user', array(
'username' => 'twin',
'createdAt' => date('Y-m-d H:i:s')
));
// 更新数据
wei()->db->update(
'user',
array('username' => 'twin'),
array('id' => '1')
);
// 删除数据
wei()->db->delete('user', array('id' => '1'));
// 查找id为1的用户
wei()->db->select('user', 1);
// 查找所有分组编号为1的用户
wei()->db->selectAll('user', array('groupId' => '1'));
Active Record模式是将数据表的每一行映射为一个对象,数据表的字段与对象的属性一一对应.
完整的介绍请查看维基百科的说明Active Record
创建一条新记录并保存
// 通过`db`方法创建一个新的用户对象
$user = wei()->db('user');
// 设置对象的值
$user['username'] = 'twin';
$user['createdAt'] = date('Y-m-d H:i:s');
// 保存到数据库中
$user->save();
查找并更新记录数据
// 查找主键为1的用户,如果存在返回用户对象,不存在返回`false`
$user = wei()->db('user')->find(array('id' => 1));
// 更新对象的值
$user['username'] = 'twin';
// 保存到数据库中
$user->save();
删除记录
// 删除id为1的用户
wei()->db('user')->destroy(array('id' => 1));
如果增删查改(CRUD)操作和Active Record模式还不能满足您的需求,你可以尝试使用QueryBuilder来生成更复杂的SQL语句
$wei = wei(array(
// 数据库对象的配置
'db' => array(
'driver' => 'mysql',
'host' => 'localhost',
'dbname' => 'wei',
'charset' => 'utf8',
'user' => 'root',
'password' => '123456',
),
// 备机数据库对象的配置
'slave.db' => array(
'driver' => 'mysql',
'host' => 'slave-host',
'dbname' => 'wei',
'charset' => 'utf-8',
'user' => 'root',
'password' => '123456',
),
// 日志数据库对象的配置
'logger.db' => array(
'driver' => 'mysql',
'host' => 'logger-host',
'dbname' => 'wei',
'charset' => 'utf-8',
'user' => 'root',
'password' => '123456',
)
));
// 获取默认数据库对象
$db = $wei->db;
// 获取备机数据库对象
$slaveDb = $wei->slaveDb;
// 获取日志数据库对象
$loggerDb = $wei->loggerDb;
// 使用日志数据库对象查询用户编号为1的操作日志
$loggerDb->findAll('userLog', array('userId' => 1));
fetch
,select
,find
和findOne
方法在db对象,fetch
,select
和find
,findOne
方法都是用于查询数据库数据,他们共同的特征是只返回第一行数据,不同点在于:
fetch
方法的第一个参数是完整的SQL语句,返回的是数组select
方法的第一个参数是数据表名称,返回的是数组find
方法的第一个参数也是数据表名称,但返回的是Wei\Record
对象findOne
方法参数和返回值与find
一样,但是当记录不存在时,会抛出一个代码为404的异常另外,如果要查询多条数据,对应的方法是fetchAll
,selectAll
和findAll
.
$db = wei()->db;
// 根据SQL语句查询一行记录,返回一个一维数组
$array = $db->fetch("SELECT * FROM user WHERE id = 1");
// 根据表名和条件查询一行记录,返回一个一维数组
$array = $db->select('user', 1);
// 根据表名和条件查询一行记录,返回一个`Wei\Record`对象
$record = $db->find('user', 1);
// 根据SQL语句查询多行记录,返回一个二维数组
$array = $db->fetchAll("SELECT * FROM user WHERE groupId = 1");
// 根据表名和条件查询多行记录,返回一个二维数组
$array = $db->select('user');
// 根据表名和条件查询多行记录,返回一个`Wei\Record`对象
$collection = $db->find('user');
方法 | 参数 | 返回值类型 |
---|---|---|
select | $table, $conditions | 数组 |
selectAll | $table, $conditions | 二维数组 |
fetch | $sql | 数组 |
fetchAll | $sql | 二维数组 |
fetchColumn | $sql | 字符串,返回指定栏的值 |
find | $table, $conditions | Wei\Record对象 |
findAll | $table, $conditions | Wei\Record对象 |
query | $sql | PDOStatement对象 |
$wei = wei(array(
'db' => array(
'beforeQuery' => function($sql, $params, $types, $db) {
$log = $sql . "\n" . var_export($params, true);
// 通过db对象获取logger对象,并调用debug方法记录SQL日志
wei()->logger->debug($log);
}
)
));
$wei->db->query("SELECT DATE('now')");
// 日志文件内容
//[2013-07-10 23:15:38] wei.DEBUG: SELECT DATE('now')
//array (
//)
通过slaveDb
选项可配置备数据库,主要具有以下功能
$wei = wei(array(
// 主数据库对象的配置
'db' => array(
'driver' => 'mysql',
'host' => 'localhost',
'dbname' => 'wei',
'charset' => 'utf8',
'user' => 'root',
'password' => '123456',
// 重要: 通过`slaveDb`选项指定备机数据库的配置名称
'slaveDb' => 'slave.db'
),
// 备机数据库对象的配置
'slave.db' => array(
'driver' => 'mysql',
'host' => 'slave-host',
'dbname' => 'wei',
'charset' => 'utf-8',
'user' => 'root',
'password' => '123456',
),
));
// 获取主数据库对象
$db = $wei->db;
// 执行写操作,使用主数据库
$db->insert('table', array('key' => 'value'));
$db->update('table', array('set' => 'value'), array('where' => 'value'))
// 执行读操作,使用备数据库
$db->select('table', array('key' => 'value'));
$db->find('table', array('key' => 'value'));
// 获取备数据库对象
$slaveDb = $wei->slaveDb;
// 直接使用备数据库操作
$slaveDb->select('table', array('key' => 'value'));
(object)
加强增删查改(CRUD)操作传统的数据库框架中,要增加文章点击数,为用户增减积分等操作,CRUD是无法一步实现的.
一般的做法是先将数据取出来,再保存回去.这种写法简单,但是在请求并发时会造成数据丢失.
// 从数据库取出数据
$article = wei()->db->select('article', 1);
// 将数据加1后更新回数据库
wei()->db->update('article', array('hit' => $article['hit']++), array('id' => 1));
另外一种做法是改为直接写原始的SQL操作,避免并发问题.
wei()->db->executeUpdate("UPDATE article SET hit = hit + 1 WHERE id = ?", array('id' => 1));
在微框架中提供了一种非常简洁的方法,只需在要插入的值前面加上(object)
,即可实现一步更新数据,同时避免并发问题.
wei()->db->update('article', array('hit' => (object)'hit + 1'), array('id' => 1));
使用(object)
对比
写法 | 生成的SQL语句 |
---|---|
wei()->db->update('article', hit' => 'hit + 1', array('id' => 1)); | UPDATE article SET hit = ? WHERE id = ? |
wei()->db->update('article', hit' => (object)'hit + 1', array('id' => 1)); | UPDATE article SET hit = hit + 1 WHERE id = ? |
注意
目前只有
insert
,update
,delete
方法支持
(object)
为文章增加1点击数
$article = wei()->db('article')->find(1);
// 记录原始点击数,可供后续输出使用
$hit = $article['hit'];
// 更改点击数并保存
$article['hit'] = (object)'hit + 1';
$article->save();
// 如果后续需要用到`hit`字段的值,有两种方法
// 1. 使用原来预存的值,硬编码输出
echo $hit + 1;
// 2. 重新加载,获取`hit`在数据库中的真实值
$article->reload();
// 输出增加后的点击数
echo $article['hit'];
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
dirver | string | mysql | 数据库驱动类型,可以是mysql ,sqlite 或pgsql
|
user | string | 无 | 连接数据库的用户名 |
password | string | 无 | 连接数据库的密码 |
host | string | 127.0.0.1 | 数据库所在的主机地址,仅驱动为mysql和pgsql时有效 |
port | string | 无 | 数据库服务器运行的端口,仅驱动为mysql和pgsql时有效 |
dbname | string | 无 | 数据库名称,仅驱动为mysql和pgsql时有效 |
unixSocket | string | 无 | MySQL数据库的Unix socket连接文件,仅驱动为mysql时有效 |
charset | string | 无 | 连接数据库的字符集,仅驱动为mysql时有效 |
path | string | 无 | SQLite数据库所在的路径,如果存储在内存中,使用:memory:
|
attrs | array | array() | PDO的属性配置 |
tablePrefix | string | 无 | 数据表名称前缀 |
recordClass | string | Wei\Record | 记录类的基础类名称 |
recordClasses | array | array() | 自定义记录类的数组,键名为数据表名称,值为记录类名称 |
recordNamespace | string | 无 | 自定义记录类的命名空间 |
slaveDb | string | 无 | Slave数据库(用于读查询)的配置名称 |
global | bool | false | 新创建的db服务是否使用默认db 的选项 |
beforeConnect | callback | 无 | 在连接PDO之前触发的回调方法 |
connectFails | callback | 无 | 连接PDO失败时触发的回调方法 |
afterConnect | callback | 无 | 连接PDO完成(成功)时触发的回调方法 |
beforeQuery | callback | 无 | 在执行SQL语句之前触发的回调方法 |
afterQuery | callback | 无 | 在执行SQL语句之后触发的回调方法 |
驱动类型 | 选项 |
---|---|
mysql | user, password, host, port, dbname, unixSocket, charset |
pgsql | user, password, host, port, dbname |
sqlite | path |
在连接PDO之前触发的回调方法
名称 | 类型 | 说明 |
---|---|---|
$db | Wei\Db | 当前Db对象 |
连接PDO失败时触发的回调方法
名称 | 类型 | 说明 |
---|---|---|
$db | Wei\Db | 当前Db对象 |
$e | PDOException | PDO异常对象 |
连接PDO完成(成功)时触发的回调方法
名称 | 类型 | 说明 |
---|---|---|
$db | Wei\Db | 当前Db对象 |
$pdo | PDO | PDO对象 |
在执行SQL语句之前触发的回调方法
名称 | 类型 | 说明 |
---|---|---|
$sql | string | 当前执行的SQL语句 |
$params | array | 执行语句的参数 |
$types | array | 执行语句的参数类型 |
$db | Wei\Db | 当前Db对象 |
在执行SQL语句之后触发的回调方法
名称 | 类型 | 说明 |
---|---|---|
$db | Wei\Db | 当前Db对象 |
根据数据表名称,创建一个新的Active Record对象
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 数据表的名称,如user ,或带别名形式的user u
|
向指定的数据表插入一条数据
返回: int
受影响的行数
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要插入的数据表名称 |
$data | array | 要插入的数据,数组的键名是数据表的字段名称,值是字段的值 |
向指定的数据表插入多条数据
返回: int
受影响的行数
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要插入的数据表名称 |
$data | array | 要插入的二维数组数据 |
获取最后插入数据表的自增编号
返回: string
参数
名称 | 类型 | 说明 |
---|---|---|
$sequence | string | 序列名称,数据库驱动为PostgreSQL 时才需要提供该参数 |
根据条件更新数据表数据
返回: int
受影响的行数
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要更新的数据表名称 |
$data | array | 要更新的数据 |
$conditions | array | 更新语句的查询条件 |
根据条件删除数据表数据
返回: int
受影响的行数
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要删除的数据表名称 |
$conditions | array | 删除语句的查询条件 |
根据条件查找数据表的一条记录
返回: array
|false
如果记录存在,返回记录数组,不存在返回false
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要查找的数据表名称 |
$conditions | string,array | 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值 |
根据条件查找数据表的所有匹配记录
返回: array
|false
如果记录存在,返回二维记录数组,不存在返回false
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要查找的数据表名称 |
$conditions | string,array | 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值 |
执行一条SQL语句并返回第一条记录,主要用于SELECT的SQL语句
返回: array
|false
如果记录存在,返回记录数组,不存在返回false
参数
名称 | 类型 | 说明 |
---|---|---|
$sql | string | 要执行的SQL语句 |
$params | array | 绑定到SQL的参数 |
执行一条SQL语句并返回所有记录
返回: array
|false
如果记录存在,返回二维记录数组,不存在返回false
参数
名称 | 类型 | 说明 |
---|---|---|
$sql | string | 要执行的SQL语句 |
$params | array | 绑定到SQL的参数 |
执行一条SQL语句,并返回指定项目的值
返回: string
参数
名称 | 类型 | 说明 |
---|---|---|
$sql | string | 要执行的SQL语句 |
$params | array | 绑定到SQL的参数 |
$column | int | 返回第几项的值 |
根据条件查找数据表的一条记录
返回: Wei\Record
|false
如果记录存在,返回记录对象,否则返回false
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要查找的数据表名称 |
$conditions | string,array | 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值 |
根据条件查找数据表的所有匹配记录
返回: Wei\Record
|false
如果记录存在,返回集合对象,否则返回false
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要查找的数据表名称 |
$conditions | string,array | 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值 |
创建一个新的数据表记录对象
返回: Wei\Record
记录对象
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 记录的数据表名称 |
$data | array | 初始化的数据 |
根据条件查找数据表的一条记录,如果记录不存在,将根据$data
创建一条新的数据表记录对象
返回: Wei\Record
记录对象
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 记录的数据表名称 |
$id | string | 主键的值 |
$data | array | 初始化的数据 |
执行一条SQL语句,并返回影响的行数,主要用于INSERT/UPDATE/DELETE操作的SQL语句
返回: int
受影响的行数
参数
名称 | 类型 | 说明 |
---|---|---|
$sql | string | 要执行的SQL语句 |
$params | array | 绑定到SQL的参数 |
执行一条SQL语句,并返回PDOStatement
对象
返回: PDOStatement
名称 | 类型 | 说明 |
---|---|---|
$sql | string | 要执行的SQL语句 |
$params | array | 绑定到SQL的参数 |
获取PDO错误代号
返回: int
获取PD错误信息数组
返回: array
检查是否已经连接到数据库
返回: bool
根据数据表名称获取记录类名称
返回: string
如果记录类不存在,返回默认类Wei\Record
获取连接数据库的用户名称
返回: string
获取连接数据库的用户密码
返回: string
获取数据库所在的主机地址
返回: string
获取数据库服务器运行的端口
返回: string
获取数据库的名称
返回: string
获取连接到PDO的DSN字符串
返回: string
获取最后执行的SQL语句
返回: string
获取所有执行过的SQL语句
返回: array
根据条件获取表的数据量
返回: int
获取指定字段的数值总和
返回: float
获取指定字段的最大数值
返回: float
获取指定字段的最小数值
返回: float
获取指定字段的平均数值
返回: float
Active Record是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
// 通过`db`方法创建一个新的用户对象
$user = wei()->db('user');
// 设置对象的值
$user['username'] = 'twin';
$user['createdAt'] = date('Y-m-d H:i:s');
// 保存到数据库中
$user->save();
// 查找主键为1的用户,如果存在返回用户对象,不存在返回`false`
$user = wei()->db('user')->find(array('id' => 1));
// 更新对象的值
$user['username'] = 'twin';
// 保存到数据库中
$user->save();
删除主键为1的用户
wei()->db('user')->destroy(1);
删除username为"twin"的用户
wei()->db('user')->destroy(array('username' => 'twin'));
class User extends \Wei\Record
{
public function softDelete()
{
$this['delete'] = true;
$this['deleteTime'] = date('Y-m-d H:i:s');
return $this->save();
}
}
$user = wei()->db('user')->find(1);
$user->softDelete();
在我个人看来,两者的最大区别在于返回的数据结构.
数组
中.数组对象(Array Object)
中,除了拥有数组所有特性外,在数据层分离
,缓存
,延迟加载(Lazy load)
等都有很大的想象空间./* @var $data array */
$data = wei()->db->fetch("SELECT * FROM table WHERE field = 'value'");
/* @var $record \Wei\Record */
$record = wei()->db('table')->find(array('field' => 'value'));
数据库连接对象
服务管理器
获取字段的值
设置字段的值
获取字段的值
设置字段的值
获取数据表名称
设置数据表名称
设置主键字段的名称
获取主键字段的名称
以数组形式返回记录里的数据
以JSON字符串形式返回记录里的数据
批量设置记录数据
保存记录数据到数据库中
从数据库中删除该记录数据
删除指定字段的值
判断当前记录是否为新建,并且未保存到数据库
判断当前记录的字段值是否修改过
获取指定字段或所有字段修改前的值
Query Builder是一个简单的SQL查询构建器.
1
且用户名为twin
的用户$member = wei()->db('member')
->select('id, username')
->where('id = 1')
->andWhere('username = ?', 'twin')
->orderBy('id', 'DESC')
->find();
// 执行的SQL语句如下
// SELECT id, title FROM member WHERE id = 1 AND author = ? ORDER BY id DESC LIMIT 1
$qb = wei()->db('member');
$qb = wei()->db('member')->where("name = 'twin'");
// 执行SQL: SELECT * FROM member WHERE name = 'twin' LIMIT 1
$member = $qb->find();
?
构造查询条件$qb = wei()->db('member')->where('name = ?', 'twin');
// 执行SQL: SELECT * FROM member WHERE name = ? LIMIT 1
$member = $qb->find();
?
构造查询条件$qb = wei()->db('member')>where('group_id = ? AND name = ?', array('1', 'twin'));
// 执行SQL: SELECT * FROM member WHERE group_id = ? AND name = ? LIMIT 1
$member = $qb->find();
:
构造查询条件$qb = wei()->db('member')
->where('group_id = :groupId AND name = :name', array(
'groupId' => '1',
'name' => 'twin'
));
// 执行SQL: SELECT * FROM member WHERE group_id = :groupId AND name = :name
$member = $qb->find();
说明
使用问号占位符
?
有助于提高开发效率,而使用命名占位符:
有助于增加可读性.在同一条SQL语句中只能使用一种占位符.
推荐单表SQL语句均使用问号占位符
?
,多表且较复杂语句才使用命名占位符:
.
$qb = wei()->db('member')->where('group_id BETWEEN ? AND ?', array('1', '2'));
// 执行SQL: SELECT * FROM member WHERE group_id BETWEEN ? AND ?
$member = $qb->find();
$qb = wei()->db('member')
->where(array(
'id' => '1',
'group_id' => array('1', '2')
));
// 执行SQL: SELECT * FROM member WHERE id = ? AND group_id IN (?, ?) LIMIT 1
$member = $qb->find();
$qb = wei()->db('member')->orderBy('id', 'ASC');
$member = $qb->find();
// 执行SQL: SELECT * FROM member ORDER BY id ASC LIMIT 1
$qb = wei()->db('member')->orderBy('id', 'ASC')->addOrderBy('group_id', 'ASC');
$member = $query->find();
// 执行SQL: SELECT * FROM member ORDER BY id ASC, group_id ASC LIMIT 1
$qb = wei()->db('member')->select('id, group_id');
$member = $query->find();
// 执行SQL: SELECT id, group_id FROM member LIMIT 1
$qb = wei()->db('member')->select('id')->addSelect('group_id');
$member = $query->find();
// 执行SQL: SELECT id, group_id FROM member LIMIT 1
$qb = wei()->db('member')->limit(2);
// 生成SQL: SELECT * FROM member LIMIT 2
echo $qb->getSql();
$qb = wei()->db('member')->limit(1)->offset(1);
// 生成SQL: SELECT * FROM member LIMIT 1 OFFSET 1
echo $qb->getSql();
$qb = wei()->db('member')->limit(3)->page(3);
// 生成SQL: SELECT * FROM member LIMIT 3 OFFSET 6
echo $qb->getSql();
注意
LIMIT的最小值为1,OFFSET的最小值为0,如果提供了无法解析的数值,将被转换为最小值.
$qb = wei()->db('member')->groupBy('id, group_id');
// 生成SQL: SELECT * FROM member GROUP BY id, group_id
echo $qb->groupBy();
$qb = wei()->db('member')->groupBy('id, group_id')->having('group_id >= ?', '1');
// 生成SQL: SELECT * FROM member GROUP BY id, group_id HAVING group_id >= ?
echo $qb->getSql();
$qb = wei()->db('member')
->select('member.*, member_group.name AS group_name')
->leftJoin('member_group', 'member_group.id = member.group_id');
// 生成SQL: SELECT member.*, member_group.name AS group_name FROM member LEFT JOIN member_group ON member_group.id = member.group_id
echo $qb->getSql();
$qb = wei()->db('member')->where('id = 1')->orderBy('id', 'DESC');
// 生成SQL: SELECT * FROM member WHERE id = 1 ORDER BY id DESC
echo $qb->getSql();
$qb->resetSqlPart('where');
// 生成SQL: SELECT * FROM member ORDER BY id DESC
echo $qb->getSql();
indexBy
控制返回二维数组的键名$qb = wei()->db('member')->indexBy('name')->limit(2);
$data = $qb->fetchAll();
// 使用前,数组的键名是数字,从0开始
$data = array(
0 => array(
'id' => '1',
'name' => 'twin',
),
1 => array(
'id' => '2',
'name' => 'test'
)
);
// 使用后,数组的键名被替换为指定字段的值
$data = array(
'twin' => array(
'id' => '1',
'name' => 'twin',
),
'test' => array(
'id' => '2',
'name' => 'test'
)
);
注意
indexBy
仅对fetchAll
和findAll
的返回值有作用,execute
方法仍然返回原始的数组- 如果字段的值重复,后面的值将覆盖前面的值
根据数据表名称,创建一个新Query Builder对象
返回: Wei\Record
设置SELECT字句要查询的字段名称
返回: Wei\Record
增加SELECT子句要查询的字段名称
返回: Wei\Record
设置SQL语句为DELETE操作
返回: Wei\Record
设置SQL语句为UPDATE操作
返回: Wei\Record
设置FROM
字句的数据表名称
返回: Wei\Record
设置WHERE
查询条件
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$conditions | string | 查询条件,如id = 1 , id = ?
|
$params | array | 参数的值 |
$types | array | 参数的类型 |
增加AND
类型的WHERE
条件到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$conditions | string | 查询条件,如id = 1 , id = ?
|
$params | array | 参数的值 |
$types | array | 参数的类型 |
增加OR
类型的WHERE
条件到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$conditions | string | 查询条件,如id = 1 , id = ?
|
$params | array | 参数的值 |
$types | array | 参数的类型 |
设置ORDER BY
字句
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$sort | string | 排序的字段名称 |
$order | string | 排序类型,ASC 或DESC
|
添加ORDER BY
字句到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$sort | string | 排序的字段名称 |
$order | string | 排序类型,ASC 或DESC
|
设置OFFSET
字句
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$offset | int |
OFFSET 字句的值,如0,10 |
设置LIMIT
字句
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$limit | int |
LIMIT 字句的值,如0,10 |
设置OFFSET
和LIMIT
字句
通过该方法设置$page
的值之后,OFFSET
的值等于($page - 1) * $limit
,如果$limit
为空,$limit
会被设置为10
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$page | int | 当前在第几页 |
增加INNER JOIN
字句到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要连接的数据表名称,如userGroup
|
$on | string | 连接的关联条件,如user.groupId = userGroup.id
|
同上,增加INNER JOIN
字句到当前查询中
增加LEFT JOIN
字句到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要连接的数据表名称,如userGroup
|
$on | string | 连接的关联条件,如user.groupId = userGroup.id
|
增加RIGHT JOIN
字句到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$table | string | 要连接的数据表名称,如userGroup
|
$on | string | 连接的关联条件,如user.groupId = userGroup.id
|
设置GROUP BY
字句
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$groupBy | string |
GROUP BY 字句的值 |
添加GROUP BY
字句到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$groupBy | string |
GROUP BY 字句的值 |
设置HAVING
字句
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$conditions | string | 查询条件,如id = 1 , id = ?
|
$params | array | 参数的值 |
$types | array | 参数的类型 |
添加AND
类型HAVING
字句到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$conditions | string | 查询条件,如id = 1 , id = ?
|
$params | array | 参数的值 |
$types | array | 参数的类型 |
添加OR
类型的HAVING
字句到当前查询中
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$conditions | string | 查询条件,如id = 1 , id = ?
|
$params | array | 参数的值 |
$types | array | 参数的类型 |
控制返回二维数组的键名为指定字段的值
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$column | string | 字段的名称,必须存在select语句中 |
重置某一部分SQL字句
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$queryPartName | string | 允许的值为select ,from ,join ,set ,where ,groupBy ,having ,orderBy ,limit 或offset
|
重置某一部分或全部SQL字句
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$queryPartNames | null | array |
执行构造的SQL语句,并返回一个Wei\Record
对象,如果结果为空,返回false
返回: Wei\Record
|false
执行构造的SQL语句,并返回一个Wei\Record
对象
返回: Wei\Record
执行构造的SQL语句,并返回一个一维数组,如果结果为空,返回false
返回: array
|false
执行构造的SQL语句,并返回一个二维数组,如果结果为空,返回false
返回: array
|false
获取当前构造的SQL语句所查找到的行数
返回: int
设置绑定参数的值和类型
返回: Wei\Record
参数
名称 | 类型 | 说明 |
---|---|---|
$key | string | 参数的名称,对于使用命名占位符的预处理语句,应是类似 :name 形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。 |
$value | mixed | 参数的值 |
$type | int | 参数的类型,使用 PDO::PARAM_* 常量明确地指定参数的类型 |
相关链接: http://php.net/manual/zh/pdostatement.bindvalue.php
设置多个绑定参数的值和类型
返回: Wei\Record
获取绑定参数的值
返回: mixed
获取所有绑定参数的值
返回: array
获取当前查询的数据表名称
返回: string
获取当前查询的完整SQL语句
返回: string
在Record对象从创建,更新到销毁的生命周期中,会触发相应的回调,以便我们更灵活的控制对象数据.
beforeCreate
和beforeSave
回调,为对象自动加上创建和修改时间class User extends \Wei\Record
{
public function beforeCreate()
{
$this['createTime'] = date('Y-m-d H:i:s');
}
public function beforeSave()
{
$this['updateTime'] = date('Y-m-d H:i:s');
}
}
// 创建一个新的记录对象并保存
$user = wei()->db('user');
$user['username'] = 'twin';
$user->save();
// 输出创建时间
echo $user['createTime'];
// 输出结果类似
'2013-12-12 14:30:00'
beforeCreate
回调,使用UUID作为主键的值class User extends \Wei\Record
{
public function beforeCreate()
{
if (!$this['id']) {
// 调用uuid服务生成一个新的uuid
$this['id'] = wei()->uuid();
}
}
}
beforeSave
和afterSave
回调,使数据表字段支持数组格式数据class Article extends \Wei\Record
{
public function beforeSave()
{
// 将数组转换为字符串以便保存到数据库
$this['images'] = json_encode($this['images']);
}
public function afterSave()
{
// 转换回数组以便后续使用
$this['images'] = json_decode($this['images'], true);
}
}
$article = wei()->db('article');
$article['title'] = 'This is title';
$article['content'] = 'This is content';
$article['images'] = array('1.jpg', '2.jpg', '3.jpg');
$article->save();
afterDestroy
回调,在对象删除后,同时删除相关数据class User extends \Wei\Record
{
public function afterDestroy()
{
// 在用户对象删除后,同时删除用户详细信息表里的数据
$this->db->destroy('userDetail', array('userId' => $this['id']));
}
}
加载记录后触发的回调
保存记录前触发的回调
保存记录后触发的回调
插入记录到数据库前触发的回调
插入记录到数据库后触发的回调
更新记录到数据库前触发的回调
更新记录到数据库后触发的回调
删除记录前触发的回调
删除记录后触发的回调
在Record对象数据更新,保存时,内部状态会跟随改变.
$user = wei()->db('user')->find(1);
if ($user->isChanged('username')) {
echo 'Yes';
} else {
echo 'No';
}
$user['username'] = 'twin';
if ($user->isChagned('username')) {
echo 'Yes';
} else {
echo 'No';
}
输出结果
'Yes'
'No'
TODO
判断当前记录是否为新建,并且未保存到数据库
判断当前记录,或指定的字段值是否修改过
获取当前记录所有,或指定字段被修改过的值
判断当前记录是否已被删除
象jQuery Ajax一样调用您的接口
$http = wei()->http(array(
// 设置请求的URL地址
'url' => 'https://api.github.com/gists',
// 默认请求方式为GET,可以设置为POST,PUT等
'method' => 'GET',
// 自动解析返回数据为JSON数组
'dataType' => 'json',
// 设置发送的参数
'data' => array(
'time' => time(),
),
));
// 输出第一条的地址,如https://api.github.com/gists/xxxxxxx
print_r($http[0]['url']);
wei()->http(array(
'url' => 'http://google.com',
'ip' => '74.125.128.105', // 线上运营环境
//'ip' => '127.0.0.1', // 本地开发环境
));
$ips = array(
'74.125.128.147',
'74.125.128.105'
);
$http = wei()->http(array(
'url' => 'http://google.com',
// 随机使用其中一个IP地址
'ip' => $ips[array_rand($ips)]
));
wei()->http(array(
'url' => 'http://google.com',
'referer' => true
));
// referer等于true时,相当于`url`的值
wei()->http(array(
'url' => 'http://google.com',
'referer' => 'http://google.com',
));
此处的get
还可以是post
, delete
, put
或patch
,表示通过相应的HTTP方法发送请求
$http = wei()->http->get('http://example.com', $data);
curlOptions
选项设置cURL会话选项http服务基于cURL实现,所有的cURL的会话选项都可以通过curlOptions
批量设置.
如设置请求代理:
$http = $wei->http(array(
'url' => 'http://www.google.com/',
'curlOptions' => array(
CURLOPT_PROXY => '192.168.18.1:8087',
)
));
Http对象提供了beforeSend
, success
, error
, complete
四个回调方法,可以用来记录日志,上报请求耗时等.
wei(array(
'http' => array(
// cURL请求发送前的回调,记录请求的方式和地址参数
'beforeSend' => function (\Wei\Http $http, $ch) {
wei()->logger->debug(array(
'Request URL' => $http->getUrl(),
'Request Method' => $http->getMethod(),
'Parameters' => $http->getData(),
));
},
// cURL请求发送成功的回调
'success' => function ($data, \Wei\Http $http) {
// 按需记录
},
// cURL请求发送失败的回调,记录错误原因和异常堆栈
'error' => function (\Wei\Http $http) {
wei()->logger->error(array(
'Error status' => $http->getErrorStatus(),
'Exception' => (string)$http->getErrorException(),
));
},
// cURL请求发送完成的回调,记录返回状态码,花费时间等
'complete' => function (\Wei\Http $http, $ch) {
$curlInfo = curl_getinfo($ch);
wei()->logger->debug(array(
'Status Code' => $curlInfo['http_code'],
'Server IP' => $http->getIp() ?: '(Not specified)',
'Total Time' => $curlInfo['total_time'] . 's',
'Response Body' => $http->getResponse(),
));
}
)
));
为提高响应和解析速度,默认请求是不输出响应头的.
如果需要获取响应头,Cookie的值,可以设置header
选项的值为true
$http = wei()->http(array(
'url' => 'http://www.google.com.hk',
'header' => true
));
// 输出所有的响应头
print_r($http->getResponseHeaders());
// 输出指定响应头的值
print_r($http->getResponseHeader('CONTENT-LENGTH'));
// 输出所有Cookie的值
print_r($http->getResponseCookies());
// 输出指定Cookie的值
print_r($http->getResponseCookie('name'));
在开发环境中,如果我们未安装SSL证书,访问HTTPS网站会提示如下错误.
curl SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
我们可以设置cURL的CURLOPT_SSL_VERIFYPEER
选项来禁用SSL证书验证.当然该方法不建议在正式环境使用.
wei()->http(array(
'url' => 'https://api.github.com/gists',
'curlOptions' => array(
CURLOPT_SSL_VERIFYPEER => false
)
));
扩展阅读:
在PHP中使用cURL来访问受SSL/TLS保护的网站
http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/
StackOverflow上关于该问题的讨论和解决方法
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
url | string | 无 | 请求的URL地址 |
method | string | GET | HTTP的请求方式,可以是GET , POST , DELETE , PUT , PATCH 或任意其他服务器支持的方式 |
contentType | string | application/x-www-form-urlencoded; charset=UTF-8 | HTTP请求头内容类型 |
cookies | array | array() | cookie数组,key是cookie的名称,value是cookie的值,cookie的值只能是字符串 |
data | array,string | array() | 要发送到服务器的数据 |
global | bool | true | 是否使用全局配置选项 |
headers | array | array | 要发送的HTTP头 |
header | bool | false | 是否要返回响应头,等于CURLOPT_HEADER 选项 |
ip | string | 无 | 要请求的URL地址中域名的IP地址,注意不是您的服务器IP地址 |
timeout | int | 0 | 整个请求的最大运行时间,单位是毫秒,默认是无限制 |
dataType | string | text | 请求完成后,要对返回数据解析的类型,可以是json (数组),jsonObject ,xml ,query ,serialize 和text
|
referer | string | 无 | 请求HTTP头中的referer值 |
userAgent | string | 无 | 请求HTTP头中的userAgent值 |
curlOptions | array | array() | 批量设置cURL会话的选项,供curl_setopt_array 函数调用 |
beforeSend | callable | 无 | 在发送请求前触发的回调,可通过该回调更改任意配置 |
success | callable | 无 | 请求并解析数据成功后触发的回调 |
error | callable | 无 | 请求或解析失败后触发的回调,可用于记录日志,展示错误信息等 |
complete | callable | 无 | 请求完成后,不论是否成功都触发的回调,可用于数据记录等 |
名称 | 类型 | 说明 |
---|---|---|
$http | Wei\Http | 当前的Http对象 |
$ch | resource | cUrl会话的变量 |
名称 | 类型 | 说明 |
---|---|---|
$data | mixed | 解析过的HTTP响应数据,数据类型与dataType 选项相关,如下表所示 |
$http | \Wei\Http | 当前的Http对象 |
dataType
的值与$data返回的类型dataType | 返回数据类型 |
---|---|
json | array |
jsonObject | stdClass |
xml | SimpleXMLElement |
query | array |
serialize | 任意PHP合法类型 |
text | string |
名称 | 类型 | 说明 |
---|---|---|
$http | Wei\Http | 当前的Http对象 |
$textStatus | string | 简单的错误说明,可能出现的值及出现情况如下表 |
$exception | Exception | 错误的异常对象,可通过该对象获取详细的错误信息 |
$textStatus
的值与出现的情况值 | 出现情况 |
---|---|
curl | cURL内部错误,如无法解析域名IP地址 |
http | HTTP状态码错误,如404页面不存在,500内部错误 |
parser | 数据解析错误,如返回的数据不是正确的json格式 |
名称 | 类型 | 说明 |
---|---|---|
$http | Wei\Http | 当前的Http对象 |
$ch | resource | cUrl会话的变量 |
初始化一个新的Http对象,并执行HTTP请求
返回: Wei\Http
新的http服务对象
根据给定的URL地址,初始化一个Http对象,并执行HTTP请求
返回: Wei\Http
新的http服务对象
返回请求及数据解析是否成功
返回: bool
获取cURL的会话变量
返回: resource
获取要发送到服务器的数据
返回: array
|string
获取设置的服务器IP地址
返回: string
获取HTTP请求的方式
返回: string
获取HTTP请求的URL地址
返回: string
获取HTTP响应头的值
获取HTTP响应的文本数据
设置HTTP的请求方式
设置HTTP请求头的值
通过GET方式发送带数据的请求
返回: Wei\Http
新的http服务对象
通过GET方式发送带数据的请求,并将返回数据解析为JSON数组
返回: Wei\Http
新的http服务对象
通过GET方式发送带数据的请求,并将返回数据解析为JSON对象
返回: Wei\Http
新的http服务对象
通过POST方式发送带数据的请求
返回: Wei\Http
新的http服务对象
通过PUT方式发送带数据的请求
返回: Wei\Http
新的http服务对象
通过DELETE方式发送带数据的请求
返回: Wei\Http
新的http服务对象
通过PATCH方式发送带数据的请求
返回: Wei\Http
新的http服务对象
检查数组或对象中每一个元素是否能通过指定规则的验证
validate
服务是参考jQuery Validation开发的数据验证器,如果你使用过
jQuery Validation
,使用validate
服务将非常容易上手.
$validator = wei()->validate(array(
// 待验证的数据
'data' => array(
'username' => 'tw',
'email' => 'invalid',
),
// 验证规则数组
'rules' => array(
'username' => array(
'minLength' => 3,
'alnum' => true,
),
'email' => array(
'email' => true
)
),
// 数据项名称的数组,用于错误信息提示
'names' => array(
'username' => '用户名',
'email' => '邮箱'
),
// 验证错误时的提示信息,留空将使用默认信息
'messages' => array(
'username' => array(
'minLength' => '%name%的长度必须大于3',
'alnum' => '%name%只能由字母和数字组成'
),
'email' => '%name%格式不正确'
)
));
// 检查是否通过验证,输出'No'
if ($validator->isValid()) {
echo 'Yes';
} else {
echo 'No';
}
// 获取第一条错误信息
$firstMessage = $validator->getFirstMessage();
// 返回的信息如下
$firstMessage = '用户名的长度必须大于3';
// 获取合并的错误信息
$joinedMessage = $validator->getJoinedMessage();
// 返回的信息如下
$joinedMessage = "用户名的长度必须大于3\n邮箱格式不正确";
// 获取简练的错误信息
$summaryMessages = $validator->getSummaryMessages();
// 返回的信息如下
$summaryMessages = array (
'username' => array (
0 => '用户名的长度必须大于3',
),
'email' => array (
0 => '邮箱格式不正确',
),
);
// 获取详细的错误信息
$detailMessages = $validator->getDetailMessages();
// 返回的信息如下
$detailMessages = array (
'username' => array (
'minLength' => array (
'tooShort' => '用户名的长度必须大于3',
),
),
'email' => array (
'email' => array (
'format' => '邮箱格式不正确',
),
),
);
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
data | array,object | array() | 待验证的数据,可以是数组或对象 |
rules | array | array() | 验证规则数组 |
names | array | array() | 数据项名称的数组,用于错误信息提示 |
messages | array | array() | 验证错误时的提示信息 |
breakRule | bool | false | 是否当任意一项规则验证不通过时就中断验证流程 |
breakField | bool | false | 是否当任意一项数据验证不通过时就中断验证流程 |
skip | bool | false | 是否当任意一项数据中的一项规则不通过时,就跳转到下一项数据的验证流程,默认是false,启用后,每项数据最多会有一个未通过的验证规则 |
ruleValid | callable | 无 | 规则验证通过时调用的回调函数 |
ruleInvalid | callable | 无 | 规则验证不通过时调用的回调函数 |
fieldValid | callable | 无 | 数据项验证通过时调用的回调函数 |
fieldInvalid | callable | 无 | 数据项验证不通过时调用的回调函数 |
success | callable | 无 | 验证器验证通过(所有验证规则都通过)时调用的回调函数 |
failure | callable | 无 | 验证器验证不通过(任意验证规则不通过)时调用的回调函数 |
待验证的数据,可以是数组或对象
验证数据的取值的顺序如下
$data
是数组或\ArrayAccess
的实例化对象,检查并返回$data[$key]
的值$data
是对象,检查属性$key
是否存在,存在则返回$data->$key
的值$data
是对象且方法get. $key
存在,返回$data->{'get' . $key}
class User
{
public function getName()
{
return 'twin';
}
public function getEmail()
{
return 'test@test.com';
}
}
// 以数组为验证数据
wei()->validate(array(
'data' => array(
'name' => 'twin',
'email' => 'test@test.com'
)
));
// 以数组对象为验证数据
wei()->validate(array(
'data' => new \ArrayObject(array(
'name' => 'twin',
'email' => 'test@test.com'
))
));
// 以对象为验证数据
wei()->validate(array(
'data' => new User
));
验证规则数组.
规则可以字符串,表示一项验证规则,也可以是数组,表示多项验证规则.
注意:
required => false
的验证规则email
规则将被转换为\Wei\Validator\Email
类,如果类不存在,将抛出异常提醒开发人员规则不存在.is
开头的,email
,digit
是正确的规则名称,isEmail
,isDigit
是错误的规则名称wei()->validate(array(
'rules' => array(
// 简单规则,将会被转换为 array('required' => true)
'name' => 'required',
// 复合规则
'email' => array(
'required' => false, // 设置为false表示email是选填
'email' => true,
'length' => array(3, 256),
),
// 完整规则
'avatar' => array(
'image' => array(
'maxWidth' => 200,
'maxHeight' => 200
)
),
// 允许的验证器格式
'数据项名称' => array(
'验证器名称1',
'验证器名称2' => array('验证的选项1', '验证的选项2'), // 参数将传递给验证器的__invoke方法
'验证器名称3' => array( // 参数将传递给验证器的setOption方法
'验证器选项名称1' => '验证器选项值1',
'验证器选项名称2' => '验证器选项值2',
)
)
)
));
is
开头,如isDigit
,isAlnum
digit
,alnum
$age = 18;
wei()->validate(array(
'data' => array(
'age' => $age
),
'rules' => array(
'age' => array(
'digit' => true, // √正确
'isDigit' => true, // ×错误
)
)
));
// 通过isDigit验证对象,验证数据
$bool = wei()->isDigit($age);
反
验证规则在验证规则前面加not
,即可使验证规则返回相反的结果,同时输出的错误信息也会做相应的改变.
如注册表单中,要求检查用户名不存在,只需使用notRecordExists
规则.
// 配置数据库
wei(array(
'db' => array(
'dbname' => 'project',
'user' => 'root',
'password' => 'xxxxxx'
)
));
$validator = wei()->validate(array(
'data' => array(
'username' => 'twin'
),
'rules' => array(
'username' => array(
// 在user表中查询userame字段的值为twin,如果找到就返回false,找不到返回true
'notRecordExists' => array('user', 'username'),
)
)
));
if (!$validator->isValid()) {
print_r($validator->getSummaryMessages());
}
// 如果user表已经存在username为twin的记录,将输出如下错误信息
array(
'username' => array(
'该项已存在'
)
);
使用notBlank
规则检查输入内容不能为空(不允许空白字符)
$validator = wei()->validate(array(
'data' => array(
'content' => ' '
),
'rules' => array(
'content' => array(
'notBlank' => true
)
),
'names' => array(
'content' => '内容'
)
));
if (!$validator->isValid()) {
print_r($validator->getSummaryMessages());
}
// 输出结果
array(
'content' => array(
'内容不能为空'
)
);
required
,notBlank
和present
验证规则这三个验证规则都用于检查数据不能为空,它们在使用场景和检查的数据内容稍有不同.
使用场景的区别
required
通常用于验证器的规则中,表示某一项是不能为空或是可选
$validator = wei()->validate(array(
'rules' => array(
'email' => array(
'required' => true,
'email' => true,
)
)
));
present
和notBlank
既可以用于验证器规则中,又可以独立作为验证对象
// 作为验证器规则
$validator = wei()->validate(array(
'rules' => array(
'email' => array(
'required' => true,
'present' => true,
'email' => true,
)
)
));
// 独立使用,注意不以`not`开头
if ($this->isBlank($input)) {
print_r($this->isBlank->getMessages());
}
if ($this->isPresent($input)) {
print_r($this->isPresent->getMessages());
}
检查内容的区别
当数据为以下值时,这三个规则均验证不通过,返回false
当数据完全由空白字符组成时,notBlank
规则会验证不通过,返回false
空白字符如下表:
字符 | ASCII | 说明 |
---|---|---|
" " | 32 | 普通空格符 |
"\t" | 9 | 制表符 |
"\n" | 10 | 换行符 |
"\r" | 13 | 回车符 |
"\0" | 0 | 空字节符 |
"\x0B" | 11 | 垂直制表符 |
来源参见trim函数
当数据由其他字符组成(包括字符串"0"
和数字0
),所有规则均验证通过,返回true
all
和allOf
验证规则规则说明:
all
: 检查数组
里的每一项是否符合指定的规则allOf
: 检查数据是否通过所有的规则校验它们的区别在于all
的检查数据必须是数组,检查的对象是数组里的每一项,allOf
可以是任意值
检查数组里的每一项是否都为数字,并且小于8
$input = array(3, 2, 5);
if (wei()->isAll($input, array(
'digit' => true,
'lessThan' => 8
))) {
echo 'Yes';
} else {
echo 'No';
}
// 输出Yes
检查数据是否为数字,并且小于8
$input = 3;
if (wei()->isAllOf($input, array(
'digit' => true,
'lessThan' => 8
))) {
echo 'Yes';
} else {
echo 'No';
}
// 输出Yes
callback
验证器自定义验证逻辑如果自带的验证规则不满足要求,可以是使用callback
规则,自定义验证逻辑和错误信息.
$validator = wei()->validate(array(
'data' => array(
'age' => 10
),
'rules' => array(
'age' => array(
'callback' => function($data, \Wei\Validator\Callback $callback, $wei) {
if ($data < 18) {
$callback->setMessage('您还未满18周岁');
return false;
} else {
return true;
}
}
)
)
));
if ($validator->isValid()) {
echo '$validator->getFirstMessage()';
}
// 输出
'您还未满18周岁'
验证错误时的提示信息.提示信息的格式与验证规则类似.
wei()->validate(array(
'rules' => array(
'name' => 'required',
'email' => array(
'required' => true,
'email' => true
),
'avatar' => array(
'image' => array(
'maxWidth' => 200,
'maxHeight' => 200
)
)
),
'messages' => array(
// 简单信息
'name' => '请输入您的用户名',
// 复合信息
'email' => array(
'required' => '请输入邮箱地址',
'email' => '您输入的邮箱格式不正确'
),
// 完整信息
'avatar' => array(
'image' => array(
'widthTooBig' => '您的头像宽度不能超过200px',
'heightTooBig' => '您的头像高度不能超过200px'
)
),
// 信息的格式
'数据项名称1' => '数据项错误信息1',
'数据项名称2' => array(
'验证器名称1' => '验证器错误信息1',
'验证器名称2' => '验证器错误信息2'
),
'数据项名称3' => array(
'验证器名称3' => array(
'验证错误信息的名称1' => '验证错误信息1'
'验证错误信息的名称2' => '验证错误信息2'
)
),
)
));
数据项名称的数组,用于错误信息提示.数组的键名是验证数据项的值,数值的值是验证数据项的名称.如
注意:如果未提供数据项名称,错误信息将以该项
作为验证数据项的名称,完整的错误信息例如该项不能为空
wei()->validate(array(
'rules' => array(
'name' => 'required',
'email' => array(
'required' => true,
'email' => true
),
'avatar' => array(
'image' => array(
'maxWidth' => 200,
'maxHeight' => 200
)
)
),
// 指定验证数据项的名称
'names' => array(
'name' => '用户名',
'email' => '邮箱',
'avatar' => '头像'
)
));
// 输出信息类似:
// 用户名不能为空
// 邮箱不能为空
// 头像宽度不能超过200px
当任意一条规则验证通过时,验证器就会触发ruleValid
回调.
参数
ruleValid($rule, $field, $validator, $wei)
名称 | 类型 | 说明 |
---|---|---|
$rule | string | 验证规则的名称 |
$field | string | 当前验证的数据项名称 |
$validator | Wei\Validate | 验证器对象 |
$wei | Wei\Wei | 对象管理器 |
如果ruleValid
回调返回false,验证器将直接中断后续所有验证流程,直接返回验证结果.
wei()->validate(array(
'data' => array(
'name' => 'twin'
),
'rules' => array(
'name' => 'required'
),
'ruleValid' => function($rule, $field, $validator, $wei) {
echo $rule;
echo $field;
echo 'Yes';
}
));
'required'
'name'
'Yes'
当任意一条规则验证 不 通过时,验证器就会触发ruleInvalid
回调.
参数
ruleInvalid($rule, $field, $validator, $wei)
名称 | 类型 | 说明 |
---|---|---|
$rule | string | 验证规则的名称 |
$field | string | 当前验证的数据项名称 |
$validator | Wei\Validate | 验证器对象 |
$wei | Wei\Wei | 对象管理器 |
ruleInvalid
与ruleValid
的行为一致.
同样的,如果ruleInvalid
回调返回false,验证器将直接中断后续所有验证流程,直接返回验证结果.
wei()->validate(array(
'data' => array(
'name' => null
),
'rules' => array(
'name' => 'required'
),
'ruleInvalid' => function($rule, $field, $validator, $wei) {
echo $rule;
echo $field;
echo 'No';
}
));
'required'
'name'
'No'
当任意数据项验证通过时,验证器就会触发fieldValid
回调.
参数
fieldValid($field, $validator, $wei)
名称 | 类型 | 说明 |
---|---|---|
$rule | string | 验证规则的名称 |
$validator | Wei\Validate | 验证器对象 |
$wei | Wei\Wei | 对象管理器 |
如果fieldValid
回调返回false,验证器将直接中断后续所有验证流程,直接返回验证结果.
wei()->validate(array(
'data' => array(
'name' => 'twin'
),
'rules' => array(
'name' => 'required'
),
'fieldValid' => function($field, $validator, $wei) {
echo $field;
echo 'Yes';
}
));
'name'
'Yes'
当任意数据项验证 不 通过时,验证器就会触发fieldInvalid
回调.
参数
fieldInvalid($field, $validator, $wei)
名称 | 类型 | 说明 |
---|---|---|
$rule | string | 验证规则的名称 |
$validator | Wei\Validate | 验证器对象 |
$wei | Wei\Wei | 对象管理器 |
如果fieldInvalid
回调返回false,验证器将直接中断后续所有验证流程,直接返回验证结果.
wei()->validate(array(
'data' => array(
'name' => null
),
'rules' => array(
'name' => 'required'
),
'fieldValid' => function($field, $validator, $wei) {
echo $field;
echo 'No';
}
));
'name'
'No'
验证结束时,如果最终验证结果为通过,验证器就触发success
回调.
success($validator, $wei)
名称 | 类型 | 说明 |
---|---|---|
$validator | Wei\Validate | 验证器对象 |
$wei | Wei\Wei | 对象管理器 |
wei()->validate(array(
'data' => array(
'name' => 'twin'
),
'rules' => array(
'name' => 'required'
),
'success' => function($validator, $wei) {
echo 'Yes';
}
));
'Yes'
验证结束时,如果最终验证结果为 不 通过,验证器就触发failure
回调.
failure ( $event, $wei, $validator )
名称 | 类型 | 说明 |
---|---|---|
$validator | Wei\Validate | 验证器对象 |
$wei | Wei\Wei | 对象管理器 |
wei()->validate(array(
'data' => array(
'name' => null
),
'rules' => array(
'name' => 'required'
),
'failure' => function($validator, $wei) {
echo 'No';
}
));
'No'
默认为false
.设置为true
后,当任意一项规则验证不通过时就中断验证流程,直接返回验证结果(false)
默认为false
.设置为true
后,当任意一项数据验证不通过时就中断验证流程,直接返回验证结果(false)
默认为false
.设置为true
后,当任意一项数据中的一项规则不通过时,就跳转到下一项数据的验证流程.
因此,每项数据最多会有一个未通过的验证规则
检查数组或对象中每一个元素是否能通过指定规则的验证
返回: Wei\Validate
新的验证器对象
参数
名称 | 类型 | 说明 |
---|---|---|
$options | array | 验证器的选项,完整内容请查看"调用方式"-"选项"章节 |
为数据项增加新的验证规则
返回: Wei\Validate
验证器对象
参数
名称 | 类型 | 说明 |
---|---|---|
$field | string | 数据项的名称 |
$rule | string | 验证规则的名称 |
$parameters | string | 验证规则的参数 |
检查数据项是否包含指定的验证规则
返回: bool
参数
名称 | 类型 | 说明 |
---|---|---|
$field | string | 数据项的名称 |
$rule | string | 验证规则的名称 |
删除指定数据项的验证规则
返回: bool
规则存在并删除返回true
,不存在返回false
参数
名称 | 类型 | 说明 |
---|---|---|
$field | string | 数据项的名称 |
$rule | string | 验证规则的名称 |
设置验证规则
返回: Wei\Validate
验证器对象
获取验证规则
返回: array
验证规则数组
设置要验证的数据
返回: Wei\Validate
验证器对象
获取要验证的数据
返回: array
设置数据项的名称
返回: Wei\Validate
验证器对象
获取数据项的名称
返回: array
获取要验证的数据项的值
返回: mixed
不存在时返回null
参数
名称 | 类型 | 说明 |
---|---|---|
$field | string | 数据项的名称 |
设置要验证的数据项的值
返回: Wei\Validate
参数
名称 | 类型 | 说明 |
---|---|---|
$field | string | 数据项的名称 |
$value | mixed | 数据项的值 |
设置自定义的错误信息
返回: Wei\Validate
参数
名称 | 类型 | 说明 |
---|---|---|
$messages | array | 错误信息数组 |
获取自定义的错误信息
返回: array
获取详细的验证错误信息
返回: array
获取简洁的验证错误信息
返回: array
获取合并的验证错误信息
返回: string
参数
名称 | 类型 | 说明 |
---|---|---|
$separator | string | 合并错误信息数组的分隔符 |
获取第一条验证错误信息
返回: string
|false
验证不通过时返回第一条错误信息,通过时返回false
获取规则验证器对象
返回: Wei\Validator\BaseValidator
|null
验证器不存在时返回null
参数
名称 | 类型 | 说明 |
---|---|---|
$field | string | 数据项的名称 |
$rule | string | 验证规则的名称 |
检查数据是否只由字母(a-z)和数字(0-9)组成
$input = 'abc123';
if (wei()->isAlnum($input)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%只能由字母(a-z)和数字(0-9)组成 |
negativeMessage | %name%不能只由字母(a-z)和数字(0-9)组成 |
检查数据是否只由字母(a-z)和数字(0-9)组成
检查数据是否只由字母(a-z)组成
$input = 'abc123';
if (wei()->isAlpha($input)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%只能由字母(a-z)组成 |
negativeMessage | %name%必须不匹配模式"%pattern%" |
检查数据是否只由字母(a-z)组成
检查数据是否为空(不允许空格)
$input = ' ';
if (wei()->isBlank($input)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
blankMessage | %name%必须为空 |
negativeMessage | %name%不能为空 |
检查数据是否为空(不允许空格)
检查数据是否在指定的字符串或正则中
if (wei()->isContains('hello', 'h')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isContains('hello', '/H/i', true)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
search | array | array() | 用于搜索的字符串或正则 |
regex | bool | false | 是否用正则匹配 |
名称 | 信息 |
---|---|
notContainsMessage | %name%必须包含%search% |
negativeMessage | %name%不能包含%search% |
检查数据是否在指定的字符串或正则中
检查数据是否为小数
if (wei()->isDecimal('1.0.0')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是小数 |
negativeMessage | %name%不能是小数 |
检查数据是否为小数
检查数据是否只由数字组成
if (wei()->isDigit('abc123')) {
echo 'Yes';
} else {
echo 'No';
}
// 输出了'No'
无
名称 | 信息 |
---|---|
patternMessage | %name%只能由数字(0-9)组成 |
negativeMessage | %name%不能只由数字(0-9)组成 |
notStringSring | %name%必须是字符串 |
检查数据是否只由数字组成
检查数据是否能被指定的除数整除
if (wei()->isDivisibleBy(10, 3)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notDivisibleMessage | %name%必须被%divisor%整除 |
negativeMessage | %name%不可以被%divisor%整除 |
检查数据是否能被指定的除数整除
检查数据是否只由双字节字符组成
if (wei()->isDoubleByte('中文abc')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%只能由双字节字符组成 |
negativeMessage | %name%不能只由双字节字符组成 |
检查数据是否只由双字节字符组成
检查数据是否以指定字符串结尾
if (wei()->isEndsWith('abc', 'C')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isEndsWith('abc', 'C', true)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
if (wei()->isEndsWith('abc', array('a', 'b', 'c'))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
findMe | string,array | - | 要查找的字符串.如果是数组,只要数据以数组中任何一个元素结尾就算验证通过 |
case | bool | false | 查找时是否区分大小写 |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notFoundMessage | %name%必须以%findMe%结尾 |
negativeMessage | %name%不能以%findMe%结尾 |
检查数据是否以指定字符串结尾
检查数据是否在指定的数组中
if (wei()->isIn(1, array(1, 2, 3))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
array | array | array() | 用于搜索的数组 |
strict | biool | false | 是否使用全等(===)进行比较,默认使用等于(==)比较 |
名称 | 信息 |
---|---|
notInMessage | %name%必须在指定的数据中:%array% |
negativeMessage | %name%不能在指定的数据中:%array% |
检查数据是否在指定的数组中
检查数据是否为小写字符
if (wei()->isLowercase('abc')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notStringMesssage | string | %name%必须是字符串 | - |
invalidMessage | string | %name%不能包含大写字母 | - |
negativeMessage | string | %name%不能包含小写字母 | - |
检查数据是否为小写字符
返回: bool
检查结果
参数
名称 | 类型 | 说明 |
---|---|---|
$input | string | 要检查的数据 |
检查数据是否符合Luhn算法
Luhn算法常用于信用卡号,防伪码校验.
if (wei()->isLuhn('4111111111111111')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
if (wei()->isLuhn('100077858')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%不是有效的数字 |
检查数据是否符合Luhn算法
返回: bool
检查结果
参数
名称 | 类型 | 说明 |
---|---|---|
$input | string | 要检查的数据 |
检查数据是否为自然数(大于等于0的整数)
if (wei()->isNaturalNumber('0')) {
echo 'Yes';
} else {
echo 'No';
}
// 输出了'Yes'
if (wei()->isNaturalNumber('-1')) {
echo 'Yes';
} else {
echo 'No';
}
// 输出了'No'
无
名称 | 信息 |
---|---|
invalidMessage | %name%必须是大于等于0的整数 |
检查数据是否为自然数(大于等于0的整数)
检查数据是否为null
if (wei()->isNull(0)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notNullMesssage | string | %name%必须是null值 | - |
negativeMessage | string | %name%不能为null值 | - |
检查数据是否为null
检查数据是否为有效数字
if (wei()->isNumber(-123.4)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notNumberMessage | string | %name%必须是有效的数字 | - |
negativeMessage | string | %name%不能是数字 | - |
检查数据是否为有效数字
检查数据是否为正整数(大于0的整数)
if (wei()->isNaturalNumber('1')) {
echo 'Yes';
} else {
echo 'No';
}
// 输出了'Yes'
if (wei()->isNaturalNumber('0')) {
echo 'Yes';
} else {
echo 'No';
}
// 输出了'No'
无
名称 | 信息 |
---|---|
invalidMessage | %name%必须是大于0的整数 |
检查数据是否为正整数(大于0的整数)
检查数据是否为空(允许空格)
if (wei()->isPresent('abc')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isPresent(' ')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
emptyMessage | %name%必须为空 |
negativeMessage | %name%不能为空 |
检查数据是否不为空(允许空格)
检查数据是否匹配指定的正则表达式
if (wei()->isRegex('abc', '/d/i')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notStringMessage | string | %name%必须是字符串 | - |
patternMessage | string | %name%必须匹配模式"%pattern%" | - |
negativeMessage | string | %name%必须不匹配模式"%pattern%" | - |
检查数据是否匹配指定的正则表达式
返回: bool
检查结果
参数
名称 | 类型 | 说明 |
---|---|---|
$input | string | 要检查的数据 |
检查数据是否为空
检查以下值会返回false,其他值(包括0)均返回true
if (wei()->isRequired(null)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
if (wei()->isRequired(0)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
requiredMessage | %name%不能为空 |
negativeMessage | %name%不合法 |
检查数据是否为空
检查数据是否以指定字符串开头
if (wei()->isEndsWith('abc', 'C')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isEndsWith('abc', 'C', true)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
if (wei()->isEndsWith('abc', array('a', 'b', 'c'))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
findMe | string,array | - | 要查找的字符串.如果是数组,只要数据以数组中任何一个元素开头就算验证通过 |
case | bool | false | 查找时是否区分大小写 |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notFoundMessage | %name%必须以%findMe%开头 |
negativeMessage | %name%不能以%findMe%开头 |
检查数据是否以指定字符串开头
检查数据是否为指定的类型
if (wei()->isType('abc', 'string')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isType(new ArrayObject(), 'Traversable')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
type | string | 无 | 数据的类型,可选值见下表 |
typeMessage | string | %name%必须是%typeName% | - |
negativeMessage | string | %name%不能是%typeName% | - |
如果type
的值不在下表中,将检查数据是否为type
的实例化对象($input instanceof $type)
值 | 名称 | 值 | 名称 |
---|---|---|---|
array | 数组 | alnum | 字母(a-z)或数字(0-9) |
bool | 布尔 | alpha | 字母 |
float | 浮点数 | cntrl | 控制字符 |
int | 整型 | digit | 数字 |
integer | 整型 | graph | 可显示字符 |
null | NULL | lower | 小写字母(a-z) |
numeric | 数字 | 可打印字符 | |
object | 对象 | punct | 标点符号 |
resource | 资源 | space | 空白字符 |
scalar | 标量 | upper | 大写字母(A-Z) |
string | 字符串 | xdigit | 16进制数字 |
检查数据是否为指定的类型
检查数据是否为大写字符
if (wei()->isLowercase('abc')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notStringMessage | string | %name%必须是字符串 | - |
invalidMessage | string | %name%不能包含小写字母 | - |
negativeMessage | string | %name%不能包含大写字母 | - |
检查数据是否为大写字符
检查数据的长度是否为指定的数值,或在指定的长度范围内
if (wei()->isLength('abc', 3)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isLength('abc', 3, 6)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
见方法
检查数据的长度是否在指定的长度范围内
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
min | int | 无 | 限制长度的最小值 |
max | int | 无 | 限制长度的最大值 |
notDetectdMessage | string | 无法检测到%name%的长度 | - |
notInMessage | string | %name%的长度必须在%min%和%max%之间 | - |
notInItemMessage | string | %name%必须包含%min%到%max%项 | - |
注意: 当检查的数据是字符串时,返回的错误信息是`notIn`,当数据是数组时,返回的是`notInItem`
检查数据的长度是否为指定的数值
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
length | int | 无 | 指定长度的值 |
notDetectdMessage | string | 无法检测到%name%的长度 | - |
lengthMessage | string | %name%的长度必须是%length% | - |
lengthItemMessage | string | %name%必须包含%length%项 | - |
注意: 当检查的数据是字符串时,返回的错误信息是`length`,当数据是数组时,返回的是`lengthItem`
检查数据的 字符数 是否为指定的数值
if (wei()->isCharLength('微框架', 3)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isCharLength('微框架', 3, 6)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
charset | string | UTF-8 | 验证数据的字符集 |
检查数据的字符数是否在指定的长度范围内
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
min | int | 无 | 限制长度的最小值 |
max | int | 无 | 限制长度的最大值 |
名称 | 信息 |
---|---|
notDetectdMessage | 无法检测到%name%的长度 |
notInMessage | %name%的长度必须在%min%和%max%之间 |
检查数据的字符数是否为指定的数值
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
length | int | 无 | 指定长度的值 |
名称 | 信息 |
---|---|
notDetectdMessage | 无法检测到%name%的长度 |
lengthMessage | %name%的长度必须是%length% |
检查数据的长度是否小于等于指定数值
if (wei()->isMaxLength('abc', 2)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
max | int | 无 | 待比较的数值 |
名称 | 信息 | 说明 |
---|---|---|
notDetectdMessage | 无法检测到%name%的长度 | |
tooLongMessage | %name%的长度必须小于等于%max% | 当数据为字符串时出现 |
tooManayMessage | %name%最多包含%max%项 | 当数据为数组时出现 |
negativeMessage | %name%不合法 |
检查数据的长度是否小于等于指定数值
检查数据的长度是否大于等于指定数值
if (wei()->isMinLength('abc', 2)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
max | int | 无 | 待比较的数值 |
名称 | 信息 | 说明 |
---|---|---|
notDetectdMessage | 无法检测到%name%的长度 | |
tooShortMessage | %name%的长度必须大于等于%min% | 当数据为字符串时出现 |
tooFewMessage | %name%至少需要包括%min%项 | 当数据为数组时出现 |
negativeMessage | %name%不合法 |
检查数据的长度是否大于等于指定数值
检查数据是否等于(==)指定的值
$post = array(
'password' => '123456',
'password_confirmation' => '123456',
);
if (wei()->isEqualTo($post['password'], $post['password_confirmation'])) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
value | mixed | 无 | 与数据比较的值 |
名称 | 信息 |
---|---|
invalidMessage | %name%必须等于%value% |
negativeMessage | %name%不能等于%value% |
检查数据是否等于(==)指定的值
检查数据是否完全等于(===)指定的值
$post = array(
'password' => '123456',
'password_confirmation' => '123456',
);
if (wei()->isIdenticalTo($post['password'], $post['password_confirmation'])) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
0
和false
是否完全相等if (wei()->isIdenticalTo(0, false)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
value | mixed | 无 | 与数据比较的值 |
名称 | 信息 |
---|---|
invalidMessage | %name%必须等于%value% |
negativeMessage | %name%不能等于%value% |
检查数据是否完全等于(===)指定的值
检查数据是否大于(>)指定的值
if (wei()->isGreaterThan(10, 20)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
value | mixed | 无 | 待比较的数值 |
名称 | 信息 |
---|---|
invalidMessage | %name%必须大于%value% |
negativeMessage | %name%不合法 |
检查数据是否大于(>)指定的值
检查数据是否大于等于(>=)指定的值
if (wei()->isGreaterThanOrEqual(10, 20)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
value | mixed | 无 | 待比较的数值 |
名称 | 信息 |
---|---|
invalidMessage | %name%必须大于等于%value% |
negativeMessage | %name%不合法 |
检查数据是否大于等于(>=)指定的值
检查数据是否小于(<)指定的值
if (wei()->isLessThan(10, 20)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
value | mixed | 无 | 待比较的数值 |
invalidMessage | string | %name%必须小于等于%max% | - |
negativeMessage | string | %name%必须不小于等于%max% | - |
检查数据是否小于(<)指定的值
检查数据是否小于等于(<=)指定的值
if (wei()->isLessThanOrEqual(10, 20)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
value | mixed | 无 | 待比较的数值 |
名称 | 信息 |
---|---|
invalidMessage | %name%必须小于等于%max% |
negativeMessage | %name%必须不小于等于%max% |
检查数据是否在指定的两个值之间
检查数据是否在指定的两个值之间,不包含值本身($min < $input < $max)
if (wei()->isBetween(18, 1, 10)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
min | int | 无 | 用于比较的较小值 |
max | int | 无 | 用于比较的较大值 |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
betweenMessage | %name%必须在%min%到%max%之间 |
negativeMessage | %name%不能在%min%到%max%之间 |
检查数据是否在指定的两个值之间
检查数据是否为合法的日期
if (wei()->isDate('2013-01-01')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isDate('2046-01-01', array('before' => date('Y-m-d')))) {
echo 'Yes';
} else {
echo 'No';
}
'No'
if (wei()->isDate('2046-01-01', array('after' => date('Y-m-d')))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
format | string | Y-m-d | 用于匹配数据的日期格式 |
before | string | 无 | 输入的日期应该早于before 的值 |
after | string | 无 | 输入的日期应该晚于after 的值 |
完整的日期格式可以查看PHP官方文档中关于date函数的格式说明.
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是合法的日期时间(当日期无法解析时出现) |
formatMessage | %name%不是合法的日期,格式应该是%format%,例如:%example% |
tooEarlyMessage | %name%必须晚于%after% |
tooLateMessage | %name%必须早于%before% |
negativeMessage | %name%不能是合法的日期 |
检查数据是否为合法的日期
检查数据是否为合法的日期,第二个参数为选项数组
检查数据是否为合法的日期时间
if (wei()->isDateTime('2013-01-01 10:00')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isDateTime('20130101', 'Ymd')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
format | string | Y-m-d H:i:s | 日期时间格式 |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是合法的日期时间(当日期无法解析时出现) |
formatMessage | %name%不是合法的日期,格式应该是%format%,例如:%example% |
tooEarlyMessage | %name%必须晚于%after% |
tooLateMessage | %name%必须早于%before% |
negativeMessage | %name%不能是合法的日期 |
完整的日期格式可以查看PHP官方文档中关于date函数的格式说明.
检查数据是否为合法的日期时间
检查数据是否为合法的时间
if (wei()->isTime('12:00:00')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isTime('12:00', 'i:s')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
format | string | H:i:s | 日期格式 |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是合法的日期时间(当日期无法解析时出现) |
formatMessage | %name%不是合法的日期,格式应该是%format%,例如:%example% |
tooEarlyMessage | %name%必须晚于%after% |
tooLateMessage | %name%必须早于%before% |
negativeMessage | %name%不能是合法的日期 |
完整的日期格式可以查看PHP官方文档中关于date函数的格式说明.
检查数据是否为合法的时间
检查数据是否为存在的目录
if (wei()->isDir('/notfound/directory')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notFoundMessage | %name%必须是存在的目录 |
negativeMessage | %name%必须是不存在的目录 |
检查数据是否为存在的目录
检查数据是否为存在的文件或目录
if (wei()->isExists('/notfound/directory')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notFoundMessage | %name%必须是存在的文件或目录 |
negativeMessage | %name%必须是不存在的文件或目录 |
检查数据是否为存在的文件或目录
检查数据是否为合法的文件,可选的检查选项有文件大小,扩展名和媒体类型
if (wei()->isImage('./5x5.gif', array('maxSize' => '1.2mb'))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
maxSize | int | 0 | 允许的文件最大字节数,允许使用类似10.5MB , 500KB 的文件大小值 |
minSize | int | 0 | 允许的文件最小字节数,允许使用类似10.5MB , 500KB 的文件大小值 |
exts | array | array() | 允许的文件扩展名 |
excludeExts | array | array() | 不允许的文件扩展名 |
mimeTypes | array | array() | 允许的文件媒体类型 |
excludeMimeTypes | array | array() | 不允许的文件媒体类型 |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notFoundMessage | %name%不存在或不可读 |
maxSizeMessage | %name%太大了(%sizeString%),允许的最大文件大小为%maxSizeString% |
minSizeMessage | %name%太小了(%sizeString%),允许的最小文件大小为%minSizeString% |
extsMessage | %name%的扩展名(%ext%)不合法,只允许扩展名为:%exts% |
excludeExtsMessage | %name%的扩展名(%ext%)不合法,不允许扩展名为:%excludeExts% |
mimeTypeNotDetectedMessage | 无法检测%name%的媒体类型 |
mimeTypesMessage | %name%的媒体类型不合法 |
excludeMimeTypesMessage | %name%的媒体类型不合法 |
negativeMessage | %name%必须是不存在的文件 |
检查数据是否为合法的文件,可选的检查选项有文件大小,扩展名和媒体类型
第一个参数$input
允许以下3种变量类型.
$_FILES
的子数组,该数组应该至少包括tmp_name
和name
两个键\SplFile
对象检查数据是否为图片,同时还可以检查图片宽度和高度是否在指定的范围内
if (wei()->isImage('./5x5.gif', array('maxWidth' => 5))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isImage('./5x5.gif', array('excludeExts' => 'gif'))) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
maxSize | int | 0 | 允许的文件最大字节数,允许使用类似10.5MB , 500KB 的文件大小值 |
minSize | int | 0 | 允许的文件最小字节数,允许使用类似10.5MB , 500KB 的文件大小值 |
exts | array | array() | 允许的文件扩展名 |
excludeExts | array | array() | 不允许的文件扩展名 |
mimeTypes | array | array() | 允许的文件媒体类型 |
excludeMimeTypes | array | array() | 不允许的文件媒体类型 |
maxWidth | int | 0 | 允许的图片最大宽度 |
maxHeight | int | 0 | 允许的图片最大高度 |
minWidth | int | 0 | 允许的图片最小宽度 |
minHeight | int | 0 | 允许的图片最小高度 |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notFoundMessage | %name%不存在或不可读 |
maxSizeMessage | %name%太大了(%sizeString%),允许的最大文件大小为%maxSizeString% |
minSizeMessage | %name%太小了(%sizeString%),允许的最小文件大小为%minSizeString% |
extsMessage | %name%的扩展名(%ext%)不合法,只允许扩展名为:%exts% |
excludeExtsMessage | %name%的扩展名(%ext%)不合法,不允许扩展名为:%excludeExts% |
mimeTypeNotDetectedMessage | 无法检测%name%的媒体类型 |
mimeTypesMessage | %name%的媒体类型不合法 |
excludeMimeTypesMessage | %name%的媒体类型不合法 |
negativeMessage | %name%必须是不存在的文件 |
notDetectedMessage | %name%不是有效的图片,或是无法检测到图片的尺寸 |
widthTooBigMessage | %name%的宽度太大(%width%px), 允许的最大宽度为%maxWidth%px |
widthTooSmallMessage | %name%的宽度太小(%width%px),允许的最小宽度应为%minWidth%px |
heightTooBigMessage | %name%的高度太大(%height%px), 允许的最大高度为%maxHeight%px |
heightTooSmallMessage | %name%的高度太小(%height%px), 允许的最小高度为%minHeight%px |
检查数据是否为图片,同时还可以检查图片宽度和高度是否在指定的范围内
图片验证器是文件验证器isFile的子类,其中选项maxSize
, minSize
, exts
,
excludeExts
, mimeTypes
, excludeMimeTypes
继承自父类.
检查数据是否为有效的邮箱地址
if (wei()->isEmail('example@example.com')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
formatMessage | %name%必须是有效的邮箱地址 |
negativeMessage | %name%不能是数字 |
检查数据是否为有效的邮箱地址
检查数据是否为有效的IP地址
if (wei()->isIp('192.168.0.1')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isIp('192.168.0.1', array('noPrivRange' => true))) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
ipv4 | bool | false | 是否只允许IPv4格式的IP地址 |
ipv6 | bool | false | 是否只允许IPv6格式的IP地址 |
noPrivRange | bool | false | 是否不允许私有的IP地址 |
noResRange | bool | false | 是否不允许保留的IP地址 |
名称 | 信息 |
---|---|
notAllowMessage | %name%必须是有效的IP地址 |
negativeMessage | %name%不能是IP地址 |
检查数据是否为有效的IP地址
检查数据是否为存在的顶级域名
if (wei()->isTld('cn')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
notInMessage | %name%必须是有效的顶级域名 |
negativeMessage | %name%不能是有效的顶级域名 |
检查数据是否为存在的顶级域名
检查数据是否为有效的URL地址,可选的检查选项有"path"和"query"
http://www.example.com
是否为有效的URL地址if (wei()->isUrl('http://www.example.com')) {
echo 'Yes';
} else {
echo 'No';
}
// 输出了Yes
http://www.example.com
是否为有效的URL地址,要求带有查询参数if (wei()->isUrl('http://www.example.com', array('query' => true))) {
echo 'Yes';
} else {
echo 'No';
}
// 输出了No
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
path | bool | false | 是否要求URL带有路径,如http://www.example.com/path/part |
query | bool | false | 是否要求URL带有查询参数,如http://www.example/?query=string |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是有效的URL地址 |
negativeMessage | %name%不能是URL地址 |
检查数据是否为有效的URL地址
检查数据是否为有效的UUID
if (wei()->isUuid('00010203-0405-0607-0809-0A0B0C0D0E0F')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notStringMessage | string | %name%必须是字符串 | - |
patternMessage | string | %name%必须是有效的UUID | - |
negativeMessage | string | %name%不能是有效的UUID | - |
检查数据是否为有效的UUID
检查数据是否为合法的信用卡号码
$input = '4111111111111111'; // Visa
if (wei()->isCreditCard($input, 'UnionPay,Visa')) {
echo 'Yes';
} else {
echo 'No';
}
if (wei()->isCreditCard($input, array('UnionPay', 'Visa'))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
type | string,array | 无 | 指定信用卡类型,多个使用, 隔开,或是使用数组,留空表示允许任意信用卡号 |
下表为目前允许的信用卡类型
发卡机构 | 中文名称 | 值 |
---|---|---|
American Express | 美国运通 | Amex |
Diners Club | 大来卡 | DinersClub |
Discover Card | 发现卡 | Discover |
JCB | - | JCB |
MasterCard | 万事达卡 | MasterCard |
China UnionPay | 中国银联 | UnionPay |
Visa | - | Visa |
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是有效的信用卡号 |
negativeMessage | %name%不能是有效的信用卡号 |
检查数据是否为合法的信用卡号码
检查数据是否为有效的电话号码(由数字,+,-和空格组成)
if (wei()->isPhone('020-1234567')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isPhone('abc-1234567')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%必须是有效的电话号码 |
negativeMessage | %name%不能是电话号码 |
检查数据是否为有效的电话号码
检查数据是否只由汉字组成
if (wei()->isChinese('中文')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%只能由中文组成 |
negativeMessage | %name%不能只由中文组成 |
检查数据是否只由汉字组成
检查数据是否为有效的中国身份证
if (wei()->isIdCardCn('342622840209049')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是有效的中国身份证 |
negativeMessage | %name%不能是有效的中国身份证 |
检查数据是否为有效的中国身份证
检查数据是否为有效的香港身份证
if (wei()->isIdCardHk('Z437626A')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是有效的香港身份证 |
negativeMessage | %name%不能是有效的香港身份证 |
检查数据是否为有效的香港身份证
检查数据是否为有效的澳门身份证
if (wei()->isIdCardMo('11111111')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notStringMessage | string | %name%必须是字符串 | - |
patternMessage | string | %name%必须是有效的澳门身份证 | - |
negativeMessage | string | %name%不能是有效的澳门身份证 | - |
检查数据是否为有效的澳门身份证
检查数据是否为有效的台湾身份证
if (wei()->isIdCardTw('A122501945')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
invalidMessage | %name%必须是有效的台湾身份证 |
negativeMessage | %name%不能是有效的台湾身份证 |
检查数据是否为有效的台湾身份证
检查数据是否为有效的中国电话号码
if (wei()->isPhoneCn('020-1234567')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%必须是有效的电话号码 |
negativeMessage | %name%不能是电话号码 |
检查数据是否为有效的电话号码
检查数据是否为有效的中国车牌号码
if (wei()->isPlateNumberCn('京A12345')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
$number = '粤A12345';
if (wei()->isStartsWith($number, '粤') && wei()->isPlateNumberCn($number)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
patternMessage | %name%必须是正确的车牌格式 |
negativeMessage | %name%不能是正确的车牌格式 |
notStringMessage | %name%必须是字符串 |
检查数据是否为有效的中国车牌号码
检查数据是否为有效的中国邮政编码
if (wei()->isPostcodeCn('123456')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
notStringMessage | string | %name%必须是字符串 | - |
patternMessage | string | %name%必须是6位长度的数字 | - |
negativeMessage | string | %name%不能是邮政编码 | - |
检查数据是否为有效的中国邮政编码
检查数据是否为有效的QQ号码
if (wei()->isQQ('123456')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
if (wei()->isQQ('0123456')) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%必须是有效的QQ号码 |
negativeMessage | %name%不能是QQ号码 |
检查数据是否为有效的QQ号码
检查数据是否为有效的中国手机号码
if (wei()->isMobileCn('13800138000')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%必须是11位长度的数字,以13,14,15或18开头 |
检查数据是否为有效的中国手机号码
检查数据是否通过所有的规则校验
$input = '123456';
if (wei()->isAllOf($input, array(
'length' => array(5, 10),
'digit' => true
))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
rules | array | - | 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项 |
名称 | 信息 |
---|---|
atLeastMessage | %name%必须满足以下所有规则 |
检查数据是否通过所有的规则校验
检查数据是否不符合所有指定的规则校验
$rules = array(
'alpha' => true,
'maxLength' => 3
);
if (wei()->isNoneOf('abc', $rules)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
rules | array | - | 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项 |
invalidMessage | string | %name%必须满足以下所有规则 | - |
检查数据是否不符合所有指定的规则校验
检查数据是否满足指定规则中的任何一条
$rules = array(
'digit' => true,
'maxLength' => 2
);
if (wei()->isOneOf('abc', $rules)) {
echo 'Yes';
} else {
echo 'No';
}
'No'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
rules | array | - | 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项 |
名称 | 信息 |
---|---|
atLeastMessage | %name%至少需要满足以下任何一条规则 |
检查数据是否满足指定规则中的任何一条
检查数据是否通过指定数量规则的验证
$rules = array(
'digit' => true,
'maxLength' => 5,
'email' => true
);
if (wei()->isSomeOf('abc', $rules)) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
rules | array | - | 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项 |
atLeast | int | 无 | 至少需要满足以下少要有多少条规则通过才算验证通过 |
atLeastMessage | string | %name%至少需要满足以下%count%条规则中的%left%条 | - |
检查数据是否通过指定数量规则的验证
检查数据表是否存在指定的记录
// 配置db服务
wei(array(
'db' => array(
'driver' => 'sqlite',
'path' => ':memory:',
)
));
$db = wei()->db;
$db->query("CREATE TABLE users (id INTEGER NOT NULL, name VARCHAR(50) NOT NULL, address VARCHAR(256) NOT NULL, PRIMARY KEY(id))");
$db->insert('users', array(
'name' => 'twin',
'address' => 'test'
));
$db->insert('users', array(
'name' => 'test',
'address' => 'test'
));
// 检查id为1的用户是否存在
if (wei()->isRecordExists('1', 'users')) {
echo 'Yes';
} else {
echo 'No';
}
// 检查name为test的用户是否存在
if (wei()->isRecordExists('test', 'users', 'name')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
table | string | 无 | 记录所在的数据表 |
field | string | id | 要查找的字段名称 |
名称 | 信息 |
---|---|
notFoundMessage | %name%不存在 |
negativeMessage | %name%已存在 |
检查数据表是否存在指定的记录
检查数组里的每一项是否符合指定的规则
$input = array(3, 2, 5);
if (wei()->isAll($input, array(
'digit' => true
))) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
rules | array | - | 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项 |
名称 | 信息 |
---|---|
notArrayMessage | %name%必须是数组 |
检查数组里的每一项是否符合指定的规则
检查数据是否通过指定回调方法验证
if (wei()->isCallback(3, function($input) {
return 0 === 10 % $input;
})) {
echo 'Yes';
} else {
echo 'No';
}
'No'
无
名称 | 信息 |
---|---|
invalidMessage | %name%不合法 |
检查数据是否通过指定回调方法验证
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$input | mixed | 无 | 待验证的数据 |
$fn | callback | 无 | 指定验证的回调结构 |
$message | string | 无 | 自定义验证不通过的提示信息 |
检查数据是否为有效的十六进制颜色
if (wei()->isColor('#FF0000')) {
echo 'Yes';
} else {
echo 'No';
}
'Yes'
无
名称 | 信息 |
---|---|
notStringMessage | %name%必须是字符串 |
patternMessage | %name%必须是有效的十六进制颜色,例如#FF0000 |
negativeMessage | %name%不能是有效的十六进制颜色 |
检查数据是否为有效的十六进制颜色
检查组成密码的字符是否符合要求格式
$passwords = array(
'abc',
'abcdef',
'123456',
'abc123'
);
foreach ($passwords as $password) {
$result = wei()->isPassword($password, array(
'minLength' => 6,
'needDigit' => true,
'needLetter' => true,
));
if ($result) {
echo 'Yes';
} else {
print_r(wei()->isPassword->getMessages());
}
}
// abc
array(
'lengthTooShort' => '密码的长度必须大于等于6'
);
// abcdef
array(
'missingCharType' => '密码必须包含数字(0-9)'
);
// 123456
array(
'missingCharType' => '密码必须包含字母(a-z)'
);
// abc123
'Yes';
密码最少由6个字符组成,必须包含数字和字母
wei()->isPassword($input, array(
'minLength' => 6,
'needDigit' => true,
'needLetter' => true,
));
密码最少由6个字符组成,必须包含数字
,小写字母
,大写字母
和非数字字母的其他字符
中的3种
wei()->isPassword($input, array(
'minLength' => 6,
'atLeastPresent' => 3,
));
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
minLength | int | 无 | 密码的最小长度,常用6 和8
|
maxLength | int | 无 | 密码的最大长度 |
needDigit | bool | false | 密码是否必须包含数字 |
needLetter | bool | false | 密码是否必须包含字母 |
needNonAlnum | bool | false | 密码是否必须包含非数字字母的其他字符,如!@# |
atLeastPresent | int | 0 | 密码必须包含数字 ,小写字母 ,大写字母 和非数字字母的其他字符 中的几种 |
名称 | 信息 |
---|---|
lengthTooShortMessage | %name%的长度必须大于等于%minLength% |
lengthTooLongMessage | %name%的长度必须小于等于%maxLength% |
missingCharTypeMessage | %name%必须包含%missingType% |
missingChar | %name%必须包含%missingType%中的%missingCount%种 |
检查组成密码的字符是否符合要求格式
管理HTTP请求数据($_REQUEST)
// 假设 $_REQUEST['id'] = 5;
// 返回5
$id = wei()->request('id');
$url = wei()->request->getUrl();
if (wei()->request->inAjax()) {
// do something
}
// 假设 $_SERVER['SERVER_ADDR'] = '127.0.0.1';
// 返回127.0.0.1
$ip = wei()->request->getServer('SERVER_ADDR');
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
fromGlobal | bool | true | 是否将PHP全局变量作为请求参数,设置为false 的话,可以自行构造请求数据 |
gets | array | array() | 当fromGlobal 为true时,相当于$_GET ,否则为空 |
posts | array | array() | 当fromGlobal 为true时,相当于$_POST ,否则为空 |
cookies | array | array() | 当fromGlobal 为true时,相当于$_COOKIE ,否则为空 |
servers | array | array() | 当fromGlobal 为true时,相当于$_SERVER ,否则为空 |
files | array | array() | 当fromGlobal 为true时,相当于$_FILES ,否则为空 |
data | array | array() | 当fromGlobal 为true时,相当于$_REQUEST ,否则为空 |
method | string | null | HTTP请求方式 |
获取HTTP请求参数的字符串值
获取HTTP请求参数的原始值
获取URL scheme的值,返回结果为http
或https
获取主机的名称,通过域名访问则返回域名地址,通过IP地址访问则返回IP地址
获取请求的URI地址
获取基本URL地址
获取请求的路径信息,一般用于路由器解析
获取用户访问的完整URL地址
获取访问用户的IP地址
获取HTTP请求方式,默认为GET
设置HTTP请求方式,可以通过该接口设置请求为PUT
,DELETE
等等
检查HTTP请求方式是否为$method
检查HTTP请求方式是否为GET
检查HTTP请求方式是否为POST
检查当前是否为ajax(XMLHttpRequest)请求
管理用户会话信息
验证码页面
wei()->session('verfiyCode', 'WIDG');
校验页面
if (wei()->session('verfiyCode') == wei()->request('verfiyCode')) {
echo '验证码正确';
} else {
echo '验证码错误';
}
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
namespace | string,false | false | 存储会话信息的命名空间,默认不启用 |
inis | array | array() | PHP会话配置选项, http://php.net/manual/en/session.configuration.php |
获取会话信息的值
设置会话信息的值
获取会话信息的值,同session($key)
设置会话信息的值,同session($key, $value)
删除指定会话名称
检查指定会话名称是否存在
删除当前命名空间的会话信息
删除所有的会话信息
获取当前命名空间下所有会话信息
检测客户端浏览器,操作系统和设备是否为指定的名称和版本
if (wei()->ua->isIPhone()) {
// do something
} elseif (wei()->ua->isAndroid()) {
// do something
}
if (wei()->ua->isIPhone()) {
// 跳转到iPhone定制页面
} elseif (wei()->ua->isIPad()) {
// 跳转到iPad定制页面
} else {
// 展示默认页面
}
echo wei()->ua->getVersion('WindowsPhone');
if (wei()->ua->isIE()) {
echo wei()->ua->getVersion('ie');
}
'10.0'
无
检测客户端是否为指定的浏览器,操作系统和手持设备
同ua($name)
获取客户端浏览器,操作系统或手持设备的版本
检查用户是否通过移动设备访问
检查用户是否通过IE浏览器访问
检查用户是否通过Chrome浏览器访问
检查用户是否通过Firefox浏览器访问
检查用户是否使用苹果iOS系统
检查用户是否使用谷歌安卓系统
检查用户是否使用微软Windows Phone系统
检查用户是否使用iPhone/iPod访问网站
检查用户是否使用iPad访问网站
保存客户端上传的文件到指定目录
$result = wei()->upload();
if ($result) {
echo 'Yes';
} else {
print_r(wei()->upload->getMessages());
}
$result = wei()->upload(array(
'maxHeight' => 2000,
'maxWidth' => 2000
));
if ($result) {
echo 'Yes';
} else {
print_r(wei()->upload->getMessages());
}
for ($i = 0; $i < 3; $i++) {
$result = wei()->upload(array(
'field' => 'upload_' . $i
));
if ($result) {
echo '文件' . $i . '上传成功';
} else {
print_r(wei()->upload->getMessages());
}
}
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
field | string | null | 上传表单中,文件上传控件name的值,留空将自动获取第一个name的值 |
dir | string | uploads | 文件保存的目录,默认是uploads
|
fileName | string | nulll | 文件保存时的名称(不包括扩展),留空表示使用原来的名称保存 |
isImage | bool | false | 是否检查上传的文件为图片,默认为否 |
maxSize | int | 0 | 允许的文件最大字节数,允许使用类似10.5MB , 500KB 的文件大小值 |
minSize | int | 0 | 允许的文件最小字节数,允许使用类似10.5MB , 500KB 的文件大小值 |
exts | array | array() | 允许的文件扩展名 |
excludeExts | array | array() | 不允许的文件扩展名 |
mimeTypes | array | array() | 允许的文件媒体类型 |
excludeMimeTypes | array | array() | 不允许的文件媒体类型 |
maxWidth | int | 0 | 允许的图片最大宽度 |
maxHeight | int | 0 | 允许的图片最大高度 |
minWidth | int | 0 | 允许的图片最小宽度 |
minHeight | int | 0 | 允许的图片最小高度 |
postSizeMessage | string | 没有文件被上传,或您上传的总文件大小超过%postMaxSize% | - |
noFileMessage | string | 没有文件被上传 | - |
formLimitMessage | string | %name%的大小超过HTML表单设置 | - |
partialMessage | string | %name%未完全上传,请再试一遍 | - |
noTmpDirMessage | string | 未找到上传文件的临时目录 | - |
cantWriteMessage | string | 无法保存%name% | - |
extensionMessage | string | 文件上传被扩展中止 | - |
notUploadedFileMessage | string | 没有文件被上传,请选择一个文件上传 | - |
cantMoveMessage | string | 无法移动上传的文件 | - |
notDetectedMessage | string | %name%不是有效的图片,或是无法检测到图片的尺寸 | - |
widthTooBigMessage | string | %name%的宽度太大(%width%px), 允许的最大宽度为%maxWidth%px | - |
widthTooSmallMessage | string | %name%的宽度太小(%width%px),允许的最小宽度应为%minWidth%px | - |
heightTooBigMessage | string | %name%的高度太大(%height%px), 允许的最大高度为%maxHeight%px | - |
heightTooSmallMessage | string | %name%的高度太小(%height%px), 允许的最小高度为%minHeight%px | - |
notFoundMessage | string | %name%不存在或不可读 | - |
maxSizeMessage | string | %name%太大了(%sizeString%),允许的最大文件大小为%maxSizeString% | - |
minSizeMessage | string | %name%太小了(%sizeString%),允许的最小文件大小为%minSizeString% | - |
extsMessage | string | %name%的扩展名(%ext%)不合法,只允许扩展名为:%exts% | - |
excludeExtsMessage | string | %name%的扩展名(%ext%)不合法,不允许扩展名为:%excludeExts% | - |
mimeTypeNotDetectedMessage | string | 无法检测%name%的媒体类型 | - |
mimeTypesMessage | string | %name%的媒体类型不合法 | - |
excludeMimeTypesMessage | string | %name%的媒体类型不合法 | - |
negativeMessage | string | %name%必须是不存在的文件 | - |
notStringMessage | string | %name%必须是字符串 | - |
上传一个文件
获取错误信息
发送HTTP响应头和响应内容
wei()->response('Hello World');
// 运行结果
'Hello World'
echo (string)wei()->response;
// 运行结果
'HTTP/1.1 200 OK
Hello World'
wei()->response(array(
'code' => 1,
'message' => '操作成功!'
));
// 运行结果
'{"code":1,"message":"\u64cd\u4f5c\u6210\u529f!"}'
结果截图:
wei()->response->jsonp(array(
'code' => 1,
'message' => '操作成功!'
));
// 假设URL请求地址为 index.php?callback=callback,运行结果为
'callback({"code":1,"message":"\u64cd\u4f5c\u6210\u529f!"})'
结果截图:
注意
只要符合正则
/^[$A-Z_][0-9A-Z_$.]*$/i
都会认为是合法的callback
值.
wei()->response->redirect('http://www.google.com', 302, array(
'redirectWait' => 3
));
wei()->response->redirect('http://www.google.com');
设置全局跳转视图文件
wei(array(
'response' => array(
'redirectView' => 'path/to/redirect.php'
)
));
文件path/to/redirect.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="refresh" content="<?= $wait ?>;url=<?= $escapedUrl ?>">
<title>正在跳转到 <?= $escapedUrl ?></title>
</head>
<body>
<h1>跳转到<a href="<?= $escapedUrl ?>"><?= $escapedUrl ?></a></h1>
</body>
</html>
wei()->response->download(__FILE__);
结果截图:
// 关闭缓冲区,发送HTTP响应等
wei()->response->flush();
for ($i = 1; $i <= 10; $i++) {
echo $i;
sleep(1);
}
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
version | string | 1.1 | HTTP版本 |
statusCode | int | 200 | HTTP状态码 |
statusText | string | OK | HTTP状态消息 |
content | string | 无 | HTTP响应内容 |
cookieOption | array | 见下表 | 设置cookie的相关选项 |
downloadOption | array | 见下表 | 调用download 方法的相关选项 |
redirectView | string | 无 | 自定义跳转视图的文件,可以设置该选项以展示更加友好的跳转视图 |
redirectWait | int | 0 | 等待跳转的秒数,如果wait为0,使用的是HTTP header跳转,如果不为0,因为HTTP header不支持延迟跳转,所以使用的是HTML Meta refresh跳转 |
beforeSend | callable | 无 | 在发送响应前调用的回调 |
afterSend | callable | 无 | 在发送响应后调用的回调 |
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
expires | int | 86400 | cookie相对于现在的过期秒数 |
path | string | / | cookie活动的路径 |
domain | string | null | 保存该cookie的域名 |
secure | bool | false | 是否只通过HTTPS安全连接来发送,只有在HTTPS连接下才有效 |
httpOnly | bool | false | 是否只通过HTTP协议发送cookie,如果是,客户端javascript将无法读取到该cookie |
raw | bool | false | 是否发送为不经过URL解码的cookie |
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
filename | string | null | 弹出下载对话框时显示的文件名称 |
type | string | application/x-download | 指定HTTP内容类型(Content-Type) |
disposition | string | attachment | 下载的方式,可选项为inline 或attachment ,如果是inline ,浏览器会先尝试直接在浏览器中打开,如果是attachment ,浏览器将直接弹出下载对话框 |
名称 | 类型 | 说明 |
---|---|---|
$response | Wei\Response | 当前HTTP响应对象 |
$content | string | 发送响应的内容 |
名称 | 类型 | 说明 |
---|---|---|
$response | Wei\Response | 当前HTTP响应对象 |
发送HTTP响应头和响应内容
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
$content | string | 无 | HTTP响应的内容 |
$stateCode | int | 200 | HTTP响应的状态码 |
设置HTTP响应的内容
获取HTTP响应的内容
设置HTTP响应的状态码
获取HTTP响应的状态码
设置内容是否已发送
下载指定的文件
关闭缓冲区,让后台脚本实时输出内容到浏览器
输出JSON格式的数据到浏览器
输出JSON或JSONP格式的数据到浏览器
跳转到指定的网址
生成带版本号的资源(CSS, JS, 图片等素材文件)URL地址,解决浏览器缓存资源文件的问题
// 在配置文件中设置资源版本号
wei(array(
'asset' => array(
'version' => '1'
)
));
// 在视图中使用asset服务生成URL地址
echo wei()->asset('style.css');
// 输出的URL地址类似
'/style.css?v=1'
如果生成的资源地址不符合您的项目路径,你可以通过baseUrl
选项来更改资源路径
wei(array(
'asset' => array(
'baseUrl' => 'project-dir/'
)
));
echo wei()->asset('backgroud.jpg');
// 输出
'project-dir/backgroud.jpg?v=1';
如果您的系统比较庞大,分为多个模块,通过简单配置即可为每个模块设置不同的资源服务对象.
wei(array(
// 定义
'asset' => array(
'baseUrl' => '/assets/'
),
// 定义'模块1'的资源选项
'mod1.asset' => array(
'baseUrl' => '/assets/mod1/'
),
// 定义'模块2'的资源选项
'mod2.asset' => array(
'baseUrl' => '/assets/mod2/'
)
));
// 输出默认的资源地址
echo wei()->asset('style.css');
// 输出
'/assets/style.css?v=1';
// 输出模块1的资源地址
echo wei()->mod1Asset('style.css');
// 输出
'/assets/mod1/style.css?v=1';
// 输出模块2的资源地址
echo wei()->mod2Asset('style.css');
// 输出
'/assets/mod2/style.css?v=1';
有时生成文件路径用于检查资源文件是否存在,可以设置第二个参数为false
,即生成不带版本号的路径.
$file = wei()->asset('styele.css', false);
if (file_exists($file)) {
// do something
}
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
baseUrl | string | / | 资源的基础URL地址 |
version | string | 1 | 自动附加到URL结尾的版本号码,如果要关闭,设置为false 即可 |
生成指定文件的资源URL地址
获取资源的基础URL地址
设置资源的基础URL地址
E,即Escaper,用于转义特殊字符,以便安全的输出到网页中,防止XSS攻击.
支持HTML,JS,CSS,HTML属性和URL的转义.
echo wei()->e('<script>alert("xss")</script>');
// 运行结果
'<script>alert("xss")</script>'
echo wei()->e->js('bar"; alert("Meow!"); var xss="true');
// 运行结果
'bar\x26quot\x3B\x3B\x20alert\x28\x26quot\x3BMeow\x21\x26quot\x3B\x29\x3B\x20var\x20xss\x3D\x26quot\x3Btrue'
echo wei()->e->css("background-image: url('http://example.com/foo.jpg?</style><script>alert(1)</script>');");
// 运行结果
'background\2D image\3A \20 url\28 \27 http\3A \2F \2F example\2E com\2F foo\2E jpg\3F \3C \2F style\3E \3C script\3E alert\28 1\29 \3C \2F script\3E \27 \29 \3B '
echo '<span title=';
echo wei()->e->attr("faketitle onmouseover=alert(/xss/);");
echo '>hi</span>';
// 运行结果
'<span title=faketitle onmouseover=alert(/xss/);>hi</span>'
echo '<a href="http://example.com/?name=';
echo wei()->e->url("onmouseover= \"alert('zf2')");
echo '">Click here!</a>';
// 运行结果
'<a href="http://example.com/?name=onmouseover%3D%20%22alert%28%27zf2%27%29">Click here!</a>'
Escaper服务是基于Zend\Escaper组件的字符串安全转义器.
Escape对象的用法与Zend\Escaper基本一致.关于Zend\Escaper的文档可以查看以下链接.
http://framework.zend.com/manual/2.1/en/modules/zend.escaper.introduction.html
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
encoding | string | utf-8 | 要转义内容的编码,应该与页面编码一致 |
转义HTML字符串
转义HTML字符串
转义Javascript字符串
转义CSS字符串
转义HTML属性字符串
转义URL字符串
渲染指定名称的模板或获取视图对象
template.php
// 设置模板所在的目录
wei()->view->setDirs(__DIR__ . '/fixtures');
// View对象将先渲染`template.php`文件,再把渲染结果存储到变量`$content`中,再渲染layout.php文件,并输出运行结果
echo wei()->view->render('template.php');
文件template.php
<?php $this->layout('layout.php') ?>
Template Content
文件layout.php
Layout Header
<?= $content ?>
Layout Footer
运行结果
'Layout Header
Template Content
Layout Footer'
注意
模板的名称要包含文件后缀,如
template.php
在视图文件中,已经预定义了服务容器对象$wei
,可以直接调用任意服务.
加载视图文件
echo wei()->view->render('index.php');
视图文件index.php
<?= $wei->escape('<a href="xss">Click me!</a>') ?>
输出结果的源码
<a href="xss">Click me!</a>
// 定义名称为`loginUrl`的视图助手方法
wei()->view->loginUrl = function(){
return '/user/login?from=' . urlencode(wei()->request->getUrl());
};
// 在视图文件中调用
echo $view->loginUrl();
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
vars | array | 无 | 模板变量数组 |
dirs | array | 无 | 模板所在的目录 |
extension | string | .php | 默认的模板扩展名 |
渲染指定名称的模板
渲染指定名称的模板,同view($name, $vars = array())
渲染并输出指定名称的模板
设置视图变量
获取视图变量
获取模板文件
设置模板的父模板名称
设置模板所在的目录
创建并运行一个MVC应用
链接: 设置类自动加载
public
如下控制器,假设访问 http://example.com/index/index 即调用Controller\Index
类的index
方法.
namespace Controller;
class Index extends \Wei\Base
{
public function __construct()
{
}
public function index()
{
}
public function aboutUs()
{
}
protected function initSomething()
{
}
}
访问以下路径均会提示action不存在.
地址 | 原因 |
---|---|
/index/notFound | 方法notFound 不存在 |
/index/initSomething | 方法initSomething 不是"public" |
/index/aboutus | 方法名称大小写错误,地址应改为"/index/aboutUs" |
/index/__construct | 方法__construct 以下划线开头,不允许访问 |
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
controllerFormat | string | Controller\%s | 控制器的类名格式,%s会被替换为类名 |
defaultController | string | index | 默认的控制器名称 |
defaultAction | string | index | 默认的行为名称 |
根据提供的选项,创建一个MVC应用,执行相应的行为方法,并输出视图数据
获取当前应用的控制器名称
设置当前应用的控制器名称
获取当前应用的行为名称
设置当前应用的行为名称
获取指定控制器的完整类名(不检查类名是否存在)
获取当前控制器和行为对应的视图文件路径
中断当前的应用逻辑
中断当前的应用逻辑,并跳转到指定的控制器和行为
配置数据管理
// 设置配置项'title'的值为'Wei Documentation'
wei()->setConfig('title', 'Wei Documentation');
// 输出配置项'title'的值
echo wei()->getConfig('title');
wei()->setConfig(array(
'yesOrNo' => array(
'y' => '是',
'n' => '否'
),
'gender' => array(
'm' => '男',
'f' => '女'
),
'priorities' => array(
-10 => '低',
0 => '中',
10 => '高'
),
'statuses' => array(
'draft' => '草稿箱',
'inProcess' => '进行中',
'done' => '完成',
)
));
注意
wei()->setConfig($array) 等同于 wei($array);
echo wei()->config->toOptions('yesOrNo');
// 输出
'<option value="y">是</option><option value="n">否</option>';
echo wei()->config->toJson('yesOrNo');
// 输出
'{"y":"\u662f","n":"\u5426"}';
无
设置配置
获取配置
转换配置为JSON字符串
转换配置为HTML下拉菜单选项
计数器服务,可用于记录用户操作次数,判断用户是否执行了某项操作等
计数器服务依赖于缓存服务,您可以通过providers
选项配置.
推荐配置的缓存服务:redis
,dbCache
等.
wei(array(
'lock' => array(
'providers' => array(
'cache' => 'redis'
)
)
));
注意
应根据计数数据的重要性,选择持久性缓存或非持久性缓存.
无
增加一个计数器的值
减少一个计数器的值
获取一个计数器的值
设置一个计数器的值
检查一个计数器是否存在
移除一个计数器
环境检测及根据不同环境加载不同的配置文件
$wei = wei(array(
'wei' => array(
'preload' => array(
'env' // 在预加载选项增加env对象
)
),
// 配置env对象的选项
'env' => array(
// 配置文件的路径,%env%会替换成当前的环境名称
'configFile' => 'config/config-%env%.php'
)
));
if (wei()->env->isDev()) {
// do something
}
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
env | string | 无 | 当前环境名称 |
detector | callable | 无 | 检测环境名称的回调结构 |
ipMap | array | array('127.0.0.1' => 'dev') | 服务器IP地址与环境名称的对应列表,键名为服务器IP地址,值为环境名称 |
configFile | string | config/config-%env%.php | 配置环境的目录,%env% 会替换成当前的环境名称 |
env
选项,使用env
作为环境名称detector
选项,调用detector
获取返回值false
继续到第4步,否则将返回值作为环境名称ipMap
的键名之中,使用对应的值作为环境名称prod
作为环境名称获取环境名称
获取环境名称
检查是否为指定的环境名称
检查是否为开发环境
检查是否为测试(Beta,演示)环境
检查是否为生产(线上)环境
设置环境名称
获取当前环境名称
错误处理器,可自定义异常,404和fatal错误的处理
wei()->error->notFound(function($exception){
// 输出错误提醒,这里可以改成加载错误视图,记录错误日志等
echo 'Page not found';
// 返回true表示错误已处理,不再输出默认的错误也页面
return true;
});
// 抛出404错误
throw new \Exception('Page not found', 404);
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
message | string | Error | 错误标题 |
detail | string | Unfortunately, an error occurred. Please try again later. | 未开启调试模式时的错误信息 |
notFoundDetail | string | Sorry, the page you requested was not found. Please check the URL and try again. | 未开启调试模式时的404错误信息 |
ignorePrevHandler | bool | false | 是否忽略已有的异常处理器 |
设置自定义的错误处理器
处理器的参数如下表.
名称 | 类型 | 说明 |
---|---|---|
$exception | Exception | 异常对象 |
$wei | Wei\Wei | 对象管理器 |
设置404的错误处理器
设置Fatal错误的处理器
根据邮箱地址生成自定义大小的Gravatar头像
echo '<img src="' . wei()->gravatar('twinhuang@qq.com') . '" />';
// 输出较小尺寸(48px)的Gravatar头像
echo '<img src="' . wei()->gravatar->small('twinhuang@qq.com') . '" />';
// 输出较大尺寸(200px)的Gravatar头像
echo '<img src="' . wei()->gravatar->large('twinhuang@qq.com') . '" />';
wei(array(
'gravatar' => array(
'default' => 'http://i2.wp.com/a248.e.akamai.net/assets.github.com/images/gravatars/gravatar-user-420.png'
)
));
echo '<img height="80" src="' . wei()->gravatar('twinhuang@example.com') . '" />';
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
default | string | mm | 当邮箱没有对应的Gravatar头像时显示的图片,可以是预设的图片类型(包括404 , mm , identicon , monsterid 或wavatar ),也可以自定义的图片地址 |
secure | bool | false | 是否输出HTTPS协议的图片地址 |
size | int | 80 | 默认的头像图片大小 |
smallSize | int | 48 | 自定义的小头像图片大小 |
largeSize | int | 200 | 自定义的大头像图片大小 |
根据邮箱地址生成自定义大小的Gravatar头像
根据邮箱地址生成较小尺寸(48px)的Gravatar头像
根据邮箱地址生成较大尺寸(200px)的Gravatar头像
锁服务,用于对请求,资源进行加锁,防止重复操作
在一些耗时长的请求(如提交表单,上传文件,实时发送邮件等),可以通过加锁防止重复提交,导致数据重复.
if (!wei()->lock('longTimeJob')) {
echo '您的请求还在执行中,请稍后再试';
return;
}
// 执行长时间的任务
sleep(5);
echo '操作成功';
$userId = '123456';
if (!wei()->lock('lottery-' . $userId)) {
echo '您的请求还在执行中,请稍后再试';
return;
}
// 重要操作1: 扣除用户抽奖次数
// $lotteryCounter->decr($userId)
// 重要操作2: 执行抽奖操作
// $lottery->draw();
注意
在请求结束后,所有的锁都会被自动释放
锁服务依赖于缓存服务,您可以通过providers
选项配置.
推荐配置的缓存服务:apc
(单台服务器),memcached
,redis
等.
wei(array(
'lock' => array(
'providers' => array(
'cache' => 'memcached'
)
)
));
无
对指定的键名加锁
返回 bool
成功时返回true
,失败返回false
对指定的键名解锁
返回 bool
键名存在时返回true
,不存在时返回false
释放当前请求所有的锁
记录日志到文件中
wei()->logger->debug('The logger is called');
// 输出日志文件的路径
echo wei()->logger->getFile();
// 可以在日志文件看到类似格式的一条日志
// [XX:XX:XX] DEBUG: The logger is called
为了快速调试,有时我们需要把日志打印在浏览器上,只需简单配置文件路径即可.
wei(array(
'logger' => array(
'file' => 'php://output' // 配置输出的文件为'php://output'
'fileDetected' => true, // 表示文件路径已经指定,不用再去检测获取
)
));
wei()->logger->debug('Output in browser');
wei()->logger->alert('An alert message');
输出结果
$logger = wei()->logger;
// 附加一项信息到日志中
$logger->setContext('reqUrl', wei()->request->getUrl());
// 附加多项信息到日志中
$logger->setContext(array(
'clientIp' => wei()->request->getIp(),
'serviceIp' => $_SERVER['SERVER_ADDR']
));
$logger->info(sprintf('User %s logined.', 'twin'));
输出结果
[05:56:16] INFO: User twin logged in.
Array
(
[clientIp] => 127.0.0.1
[serviceIp] => 127.0.0.1
[reqUrl] => http://localhost/index.php
)
除了字符串之外,日志信息还可以是数组
wei()->logger->debug(array(
'code' => 1,
'message' => '操作成功'
));
输出结果
[05:58:10] DEBUG: Array
(
[code] => 1
[message] => 操作成功
)
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
name | string | wei | 日志的名称,可以每个模块设定一个名称进行区分 |
level | string | debug | 默认的日志级别 |
handledLevel | string | debug | 记录到文件的最低日志等级,低于该等级的日志将不记录到文件中 |
format | string | [%datetime%] %level%: %message%\n | 日志的格式 |
dateFormat | string | H:i:s | 日志中日期的格式,使用date函数转换 |
dir | string | log | 日志文件的目录 |
fileFormat | string | Ymd.\l\o\g | 日志文件名称的格式 |
fileSize | int | 134217728 | 日志文件最大容量,单位是字节,默认是128mb,设为0表示不限制大小 |
file | string | 无 | 日志文件的路径,留空表示根据dir ,fileFormat 和fileSize 选项生成,不留空的话需设置fileDetected 才有效 |
fileDetected | bool | false | 日志文件路径是否已确认,与file 选项搭配使用 |
context | array | array() | 附加到每条日志的默认内容,如用户IP地址,请求URL地址等 |
名称 | 级别 | 使用场景 |
---|---|---|
debug | 低 | 具体的调试信息,如某个函数被调用了,某个参数的值,主要用于调试 |
info | 低 | 有用的信息,如某某用户登录了,SQL日志 |
warning | 中 | 个别情况出现的信息,例如使用废弃的接口,接口使用场景错误,配置错误 |
error | 中 | 运行中的错误,不需要马上处理,但应该被记录及监控,如邮件发送失败 |
critical | 高 | 严重的情况,如某个组件不可用,未捕获的异常 |
alert | 高 | 必须马上处理的情况,如网站打不开,数据库连不上,这种情况下应该发送短信通知你处理! |
日志等级及说明来自于Monolog
除了上面之外,还有notice和emergency级别,因不推荐使用,且为避免混淆,不一一详细说明.
记录一条日志
记录一条DEBUG等级的日志
记录一条info等级的日志
记录一条warning等级的日志
记录一条error等级的日志
记录一条critical等级的日志
记录一条alert等级的日志
获取日志文件
设置默认的日志等级
设置记录的最低日志等级
设置一项日志附加信息
设置多项日志附加信息
删除日志目录下的所有文件(注意谨慎使用)
安全简单的密码加密,校验服务
// 获取表单提交的密码字符串
$password = wei()->request('password');
// 生成在加密(散列)密码用的盐(干扰字符串)
$salt = wei()->password->generateSalt();
// 通过密码和盐加密密码
$password = wei()->password->hash($password, $salt);
// 构造用户信息数组,注意保存盐供后续使用
$user = array(
'username' => 'xxx',
'salt' => $salt,
'password' => $password,
);
// 保存到数据库
wei()->db->insert('user', $user);
如果盐为空将自动生成
$password = wei()->password->hash('12@Wer@34');
// 输出结果为60字节的字符串,类似如下
'$2y$10$fY5aEqo6uzXme2.6jIfFnei.J95RVOwZBKR3ueAkBIVCgpP2XbAga'
// 密码,一般从前台表单中获取
$password = '12@Wer@34';
// 加密过的密码,一般从数据库中取出来
$hash = '$2y$10$fY5aEqo6uzXme2.6jIfFnei.J95RVOwZBKR3ueAkBIVCgpP2XbAga';
if (wei()->password->verify($password, $hash)) {
// 通过session设置用户登录态
wei()->session['user'] = 'xxx';
echo '密码正确';
} else {
echo '密码错误';
}
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
cost | int | 10 | 加密算法递归的层数,应该在4~32之间 |
加密密码
返回: string
60个字符长度的字符串
检查密码是否正确
返回: boolean
生成适合密码加密的盐(干扰字符串)
返回: string
22个字符长度的字符串
获取加密密码的加密信息
返回: array
将中文转换为拼音字母
// 输出`PHPweikuangjia`
echo wei()->pinyin('PHP微框架');
无
将中文转换为拼音字母
返回: string
拼音字母
参数
名称 | 类型 | 说明 |
---|---|---|
$word | string | 要转换的中文字符 |
生成一个随机的UUID
// 输出格式类似"05b59eca-866d-410b-96d7-e4f2c286f5a8"
echo wei()->uuid();
无
生成一个随机的UUID
生成的UUID可用于数据表主键,相比通过SQL语句SELECT UUID
生成的UUID要快很多,而且调用更加方便.
PHP Error提供了更友好的错误提示信息,完整的语法和代码片段高亮,同时支持Ajax错误提示
wei(array(
'wei' => array(
'preload' => array(
'phpError' // 在预加载选项增加phpError对象
)
),
// 配置phpError对象的选项
'phpError' => array(
'catch_ajax_errors' => true,
'catch_class_not_found' => true,
// more options
)
));
参见PHP Error官网文档https://github.com/JosephLenton/PHP-Error/wiki/Options
获取\php_error\ErrorHandler对象