欢迎

欢迎来到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");

1. 通过Composer下载

{
    "require": {
        "wei/wei": "0.9.9"
    }
}

2. 直接下载

稳定版 v0.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 ini配置

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选项加载自定义服务

除了系统自带的对象之外,你也可以自定义对象类.

  1. 定义您的类,继承于\Wei\Base

    namespace MyProject;
    
    class Application extends \Wei\Base
    {
        public function run()
        {
            // do something
        }
    }
    
  2. 设置aliases选项,指定您的类所作为的服务名称

    wei(array(
        'wei' => array(
            'aliases' => array(
                '服务名称' => '类名称',
                'app' => 'MyProject\Application'
            )
        )
    ));
    
  3. 调用您的对象

    // 获取自定义服务
    /* @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'
            )
        ),
    )
));

区分aliasesproviders选项

  1. aliases选项数组的key是服务名称,value是类名称
  2. 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 每个对象初始化后的回调

回调

beforeConstruct($wei, $full, $name)

名称 类型 说明
$wei Wei\Wei 对象管理器
$full string 完整的对象名称,包含.连接符,如db,user.db
$name string 对象名称,不包含.连接符,如db,request

afterConstruct($wei, $full, $name, $object)

名称 类型 说明
$wei Wei\Wei 对象管理器
$full string 完整的对象名称,包含.连接符,如db,user.db
$name string 对象名称,不包含.连接符,如db,request
$object Wei\Base 当前初始化的对象

方法

wei($config)

获取对象管理器,如果不存在,将创建一个新的对象

返回: Wei\Wei 对象管理器

参数

名称 类型 说明
$config string,array 对象的配置数组或配置文件

wei()->isDebug()

检查是否启用了调试模式

返回: bool

wei()->setDebug($debug)

开启或关闭调试模式

返回: Wei\Wei 对象管理器

参数

名称 类型 说明
$debug bool 是否启用调试

wei()->setConfig($name, $vlaue = array())

设置对象的配置

返回: Wei\Wei 对象管理器

参数

名称 类型 默认值 说明
$name string 对象的名称,如request, request.sub
$value array 对象的配置选项

wei()->setConfig($array = array())

设置对象所有配置

返回: Wei\Wei 对象管理器

参数

名称 类型 默认值 说明
$array array 对象的完整配置

wei()->getConfig($name)

获取对象的选项配置

返回: mixed 配置的值,如果配置不存在,返回null

参数

名称 类型 默认值 说明
$name string 配置的名称

wei()->get($name, $options = array(), $providers = array())

获取一个对象

名称 类型 默认值 说明
$name string 对象的名称
$options array 除了会通过config方法获取配置选项之外的附加的配置选项
$providers array 指定对象的依赖关系

wei()->import($dir, $namespace, $format = null)

导入指定目录下的类文件

名称 类型 默认值 说明
$dir string 类文件所在的目录
$namespace string 类名对应的命名空间
$format string 类文件的格式

wei()->newInstance($name, $options = array(), $providers = array())

初始化一个新的对象

wei()->set($name, wei())

设置对象

wei()->remove($name)

移除对象,如果对象存在,返回true,否则返回false

wei()->getClass($name)

根据对象名称获取对象类名

wei()->has($name)

检查对象是否存在

wei()->setAutoload($bool)

启用或禁用PSR-0类自动加载

缓存数据服务,可设定Memcached,Redis,APC,文件等作为缓存驱动

案例

设置和获取缓存

// 设置缓存,成功返回true,失败返回false
wei()->cache('key', 'value');

// 获取缓存,返回'value'
wei()->cache('key');

设置60秒后就过期的缓存

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');

批量设置和获取缓存

注意: 目前只有rediscouchbase支持原生的批量设置,其他的缓存实际都是通过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()),
);

根据文件路径和最后修改时间,生成缓存内容

常用场景

  1. 缓存JSON,YAML,INI等非PHP原生支持文件的解析结果
  2. 在自定义视图引擎中,缓存模板文件的编译结果
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
速度
持久化 × - × ×
分布式 × × ×
原子性 × ×

说明:

通用方法

在下面的方法中,cache表示缓存类的名称,可以替换为其他任意缓存,如redis, memcached

cache($key, $value, $expire = 0)

设置缓存的值

返回: bool 是否设置成功

参数

名称 类型 默认值 说明
$key string 缓存的键名
$value mixed 缓存的值,允许任意变量类型
$expire int 0 缓存的有效期,默认为0秒,表示永不过期

cache($key)

获取指定名称的缓存

返回: mixed

参数

名称 类型 默认值 说明
$key string 缓存的键名

cache->set($key, $value, $expire = 0)

设置缓存的值,同cache($key, $value, $expire = 0)

cache->get($key)

获取缓存的值,同cache($key)

cache->remove($key)

移除一项缓存

返回: bool 缓存存在时返回true,不存在返回false

参数

名称 类型 默认值 说明
$key string 缓存的键名

cache->exists($key)

检查缓存是否存在

返回: bool

参数

名称 类型 默认值 说明
$key string 缓存的键名

cache->add($key, $value, $expire = 0)

增加一项缓存,如果缓存已存在,返回false

返回: bool

参数

名称 类型 默认值 说明
$key string 缓存的键名
$value mixed 缓存的值,允许任意变量类型
$expire int 0 缓存的有效期,默认为0秒,表示永不过期

cache->replace($key, $value)

替换一项缓存,如果缓存不存在,返回false

返回: bool

参数

名称 类型 默认值 说明
$key string 缓存的键名
$value mixed 缓存的值,允许任意变量类型

cache->incr($key, $offset = 1)

增大一项缓存的值

返回: int 增大后缓存的值

参数

名称 类型 默认值 说明
$key string 缓存的键名
$offset int 1 增大的值

cache->decr($key, $offset = 1)

减小一项缓存的值

返回: int 减小后缓存的值

参数

名称 类型 默认值 说明
$key string 缓存的键名
$offset int 1 减小的值

cache->getMulti($keys)

批量获取缓存的值

返回: array 数组的键名是缓存的名称,值是缓存的值,如果某项缓存不存在,它的值为false

参数

名称 类型 默认值 说明
$keys array 缓存的键名数组

cache->setMulti($values)

批量设置缓存的值

返回: array 数组的键名是缓存的名称,值操作结果,即truefalse

参数

名称 类型 默认值 说明
$values array 要缓存的数据

cache->clear()

清除所有的缓存

返回: bool

注意

该方法会把所有的缓存内容都清空,不仅仅是以$prefix开头的缓存.因为大部分缓存未提供按前缀清空缓存的功能.

cache->getFileContent($file, $fn)

根据文件路径和最后修改时间,生成缓存内容

cache->getPrefix()

获取键名前缀

cache->setPrefix($prefix)

设置键名前缀

通过面向对象的方式设置或获取PHP APC缓存,并提供更多友好方便的功能方法.

案例

设置和获取缓存

// 设置缓存,返回true
wei()->apc('key', 'value');

// 获取缓存,返回'value'
wei()->apc('key');

设置60秒后就过期的缓存

wei()->apc('key', 'value', 60);

更多案例请查看Cache

调用方式

选项

继承的方法

通用方法请查看Cache

方法

数组缓存,将数据存储在PHP数组中,每次 请求结束 数据就会被 清空.

使用数组缓存主要有两个场景:

  1. 在开发环境使用,确保每次页面请求都会获得最新生成的数据
  2. 对计算结果进行临时存储,以便在不同地方获取数据,减少重复计算消耗的时间

案例

设置和获取缓存

// 设置缓存,返回true
wei()->arrayCache('key', 'value');

// 获取缓存,返回'value'
wei()->arrayCache('key');

更多案例请查看Cache

调用方式

选项

继承的方法

通用方法请查看Cache

方法

设置或获取缓存,数据存储在二级缓存中

二级缓存使用主从同步机制,由一个主缓存(master)和一个从缓存(slave)组成,二级缓存的原理非常简单,有以下两点.

  1. 每次读取数据时,如果主缓存读取不到数据,将从从缓存读取数据
  2. 每次写入数据时,如果检查上次更新到从缓存的间隔秒数大于配置秒数,则同步数据到从缓存中

案例

设置和获取缓存

// 设置缓存,返回true
wei()->bicache('key', 'value');

// 获取缓存,返回'value'
wei()->bicache('key');

设置60秒后就过期的缓存

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');

设置60秒后就过期的缓存

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->getObject()

获取原生Couchbase对象

couchbase->setObject($couchbase)

设置原生Couchbase对象

设置或获取一项缓存,缓存数据存储于数据库中

dbCache对象依赖于db对象

案例

设置和获取缓存

// 设置缓存,返回true
wei()->dbCache('key', 'value');

// 获取缓存,返回'value'
wei()->dbCache('key');

设置60秒后就过期的缓存

wei()->dbCache('key', 'value', 60);

更多案例请查看Cache对象

调用方式

选项

名称 类型 默认值 说明
table string cache 缓存数据表名称

继承的方法

通用方法请查看Cache对象

方法

设置或获取文件缓存

案例

设置和获取文件缓存

// 设置缓存,返回true
wei()->fileCache('key', 'value');

// 获取缓存,返回'value'
wei()->fileCache('key');

更多案例请查看Cache对象

调用方式

选项

名称 类型 默认值 说明
dir string cache 缓存文件存储的目录

继承的方法

通用方法请查看Cache对象

方法

fileCache->getDir()

获取文件缓存的目录

fileCache->setDir($dir)

设置文件缓存目录

fileCache->getFile($key)

根据缓存名称获取缓存文件路径

设置或获取一项缓存,缓存数据存储于Memcache中

案例

设置和获取缓存

// 设置缓存,返回true
wei()->memcache('key', 'value');

// 获取缓存,返回'value'
wei()->memcache('key');

设置60秒后就过期的缓存

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->getObject()

获取原生Memcache对象

memcache->setObject($memcache)

设置原生Memcache对象

设置或获取一项缓存,缓存数据存储于memcached中

案例

设置和获取缓存

// 设置缓存,返回true
wei()->memcached('key', 'value');

// 获取缓存,返回'value'
wei()->memcached('key');

设置60秒后就过期的缓存

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->getObject()

获取原生Memcached对象

memcached->setObject($memcached)

设置原生Memcached对象

设置或获取一项缓存,缓存数据存储于MangoDB

案例

设置和获取缓存

// 设置缓存,返回true
wei()->mongoCache('key', 'value');

// 获取缓存,返回'value'
wei()->mongoCache('key');

设置60秒后就过期的缓存

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');

设置60秒后就过期的缓存

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->getObject()

获取原生Redis对象

redis->setObject($redis)

设置原生Redis对象

基于PDO的数据库操作对象,支持基本的增删查改(CRUD)和流行的Active Record模式的数据库操作.

目前主要支持MySQL,SQLitePostgreSQL数据库.

案例

增删查改(CRUD)操作

// 插入数据
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模式是将数据表的每一行映射为一个对象,数据表的字段与对象的属性一一对应.

完整的介绍请查看维基百科的说明Active Record

查看Active Record API

创建一条新记录并保存

// 通过`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));

SQL查询构建器

如果增删查改(CRUD)操作和Active Record模式还不能满足您的需求,你可以尝试使用QueryBuilder来生成更复杂的SQL语句

查看QueryBuilder API

连接到多个数据库

$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,findfindOne方法

在db对象,fetch,selectfind,findOne方法都是用于查询数据库数据,他们共同的特征是只返回第一行数据,不同点在于:

另外,如果要查询多条数据,对应的方法是fetchAll,selectAllfindAll.

$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对象

通过beforeQuery回调记录SQL日志

$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 (
//)

配置读写分离(master-slave)的数据库操作

通过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方法支持

在Active Record中使用(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,sqlitepgsql
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

回调

beforeConnect

在连接PDO之前触发的回调方法

名称 类型 说明
$db Wei\Db 当前Db对象

connectFails

连接PDO失败时触发的回调方法

名称 类型 说明
$db Wei\Db 当前Db对象
$e PDOException PDO异常对象

afterConnect

连接PDO完成(成功)时触发的回调方法

名称 类型 说明
$db Wei\Db 当前Db对象
$pdo PDO PDO对象

beforeQuery

在执行SQL语句之前触发的回调方法

名称 类型 说明
$sql string 当前执行的SQL语句
$params array 执行语句的参数
$types array 执行语句的参数类型
$db Wei\Db 当前Db对象

afterQuery

在执行SQL语句之后触发的回调方法

名称 类型 说明
$db Wei\Db 当前Db对象

方法

db($table = null)

根据数据表名称,创建一个新的Active Record对象

返回: Wei\Record

参数

名称 类型 说明
$table string 数据表的名称,如user,或带别名形式的user u

db->insert($table, $data = array())

向指定的数据表插入一条数据

返回: int 受影响的行数

参数

名称 类型 说明
$table string 要插入的数据表名称
$data array 要插入的数据,数组的键名是数据表的字段名称,值是字段的值

db->insertBatch($table, $data = array())

向指定的数据表插入多条数据

返回: int 受影响的行数

参数

名称 类型 说明
$table string 要插入的数据表名称
$data array 要插入的二维数组数据

db->lastInsertId($sequence = null)

获取最后插入数据表的自增编号

返回: string

参数

名称 类型 说明
$sequence string 序列名称,数据库驱动为PostgreSQL时才需要提供该参数

db->update($table, $data = array(), $conditions = array())

根据条件更新数据表数据

返回: int 受影响的行数

参数

名称 类型 说明
$table string 要更新的数据表名称
$data array 要更新的数据
$conditions array 更新语句的查询条件

db->delete($table, $conditions = array())

根据条件删除数据表数据

返回: int 受影响的行数

参数

名称 类型 说明
$table string 要删除的数据表名称
$conditions array 删除语句的查询条件

db->select($table, $conditions = array())

根据条件查找数据表的一条记录

返回: array|false 如果记录存在,返回记录数组,不存在返回false

参数

名称 类型 说明
$table string 要查找的数据表名称
$conditions string,array 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值

db->selectAll($table, $conditions = array())

根据条件查找数据表的所有匹配记录

返回: array|false 如果记录存在,返回二维记录数组,不存在返回false

参数

名称 类型 说明
$table string 要查找的数据表名称
$conditions string,array 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值

db->fetch($sql, $params = array())

执行一条SQL语句并返回第一条记录,主要用于SELECT的SQL语句

返回: array|false 如果记录存在,返回记录数组,不存在返回false

参数

名称 类型 说明
$sql string 要执行的SQL语句
$params array 绑定到SQL的参数

db->fetchAll($sql, $params = array())

执行一条SQL语句并返回所有记录

返回: array|false 如果记录存在,返回二维记录数组,不存在返回false

参数

名称 类型 说明
$sql string 要执行的SQL语句
$params array 绑定到SQL的参数

db->fetchColumn($sql, $params = array(), $column = 0)

执行一条SQL语句,并返回指定项目的值

返回: string

参数

名称 类型 说明
$sql string 要执行的SQL语句
$params array 绑定到SQL的参数
$column int 返回第几项的值

db->find($table, $conditions)

根据条件查找数据表的一条记录

返回: Wei\Record|false 如果记录存在,返回记录对象,否则返回false

参数

名称 类型 说明
$table string 要查找的数据表名称
$conditions string,array 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值

db->findAll($table, $conditions)

根据条件查找数据表的所有匹配记录

返回: Wei\Record|false 如果记录存在,返回集合对象,否则返回false

参数

名称 类型 说明
$table string 要查找的数据表名称
$conditions string,array 查询条件,如果类型是字符串,表示主键的值,如果是数组,键名表示数据表字段,值表示字段的值

db->create($table, $data = array())

创建一个新的数据表记录对象

返回: Wei\Record 记录对象

参数

名称 类型 说明
$table string 记录的数据表名称
$data array 初始化的数据

db->findOrInit($table, $id, $data = array())

根据条件查找数据表的一条记录,如果记录不存在,将根据$data创建一条新的数据表记录对象

返回: Wei\Record 记录对象

参数

名称 类型 说明
$table string 记录的数据表名称
$id string 主键的值
$data array 初始化的数据

db->executeUpdate($sql, $params = array())

执行一条SQL语句,并返回影响的行数,主要用于INSERT/UPDATE/DELETE操作的SQL语句

返回: int 受影响的行数

参数

名称 类型 说明
$sql string 要执行的SQL语句
$params array 绑定到SQL的参数

db->query($sql, $params = array())

执行一条SQL语句,并返回PDOStatement对象

返回: PDOStatement

名称 类型 说明
$sql string 要执行的SQL语句
$params array 绑定到SQL的参数

db->errorCode()

获取PDO错误代号

返回: int

db->errorInfo()

获取PD错误信息数组

返回: array

db->isConnected()

检查是否已经连接到数据库

返回: bool

db->getRecordClass($table)

根据数据表名称获取记录类名称

返回: string 如果记录类不存在,返回默认类Wei\Record

db->getUser()

获取连接数据库的用户名称

返回: string

db->getPassword()

获取连接数据库的用户密码

返回: string

db->getHost()

获取数据库所在的主机地址

返回: string

db->getPort()

获取数据库服务器运行的端口

返回: string

db->getDbname()

获取数据库的名称

返回: string

db->getDsn()

获取连接到PDO的DSN字符串

返回: string

db->getLastQuery()

获取最后执行的SQL语句

返回: string

db->getQueries()

获取所有执行过的SQL语句

返回: array

db->count($table, $conditions = false)

根据条件获取表的数据量

返回: int

db->sum($table, $field, $conditions = false)

获取指定字段的数值总和

返回: float

db->max($table, $field, $conditions = false)

获取指定字段的最大数值

返回: float

db->min($table, $field, $conditions = false)

获取指定字段的最小数值

返回: float

db->avg($table, $field, $conditions = false)

获取指定字段的平均数值

返回: float

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();

删除记录

删除主键为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();

Active Record与常规数据库查询的最大区别

在我个人看来,两者的最大区别在于返回的数据结构.

  1. 常规查询将数据存储在数组中.
  2. Active Record将数据存储在数组对象(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'));

调用方式

属性

Wei\Db $db

数据库连接对象

Wei\Wei $wei

服务管理器

方法

$record[$field]

获取字段的值

$record[$field] = 'xxx'

设置字段的值

$record->get($field)

获取字段的值

$record->set($field, $value)

设置字段的值

$record->getTable()

获取数据表名称

$record->setTable($table)

设置数据表名称

$record->setPrimaryKey($primaryKey)

设置主键字段的名称

$record->getPrimaryKey()

获取主键字段的名称

$record->toArray()

以数组形式返回记录里的数据

$record->toJson()

以JSON字符串形式返回记录里的数据

$record->fromArray($data)

批量设置记录数据

$record->save()

保存记录数据到数据库中

$record->destroy()

从数据库中删除该记录数据

$record->remove($field)

删除指定字段的值

$record->isNew()

判断当前记录是否为新建,并且未保存到数据库

$record->isChanged()

判断当前记录的字段值是否修改过

$record->getChangedData($field = null)

获取指定字段或所有字段修改前的值

Query Builder是一个简单的SQL查询构建器.

案例

从用户表里查询id为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

创建一个新的QueryBuilder

$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();

构造IN查询

$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();

构造ORDER BY语句

$qb = wei()->db('member')->orderBy('id', 'ASC');

$member = $qb->find();

// 执行SQL: SELECT * FROM member ORDER BY id ASC LIMIT 1

增加ORDER BY语句

$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

设置SELECT查询的字段

$qb = wei()->db('member')->select('id, group_id');

$member = $query->find();

// 执行SQL: SELECT id, group_id FROM member LIMIT 1

增加SELECT查询的字段

$qb = wei()->db('member')->select('id')->addSelect('group_id');

$member = $query->find();

// 执行SQL: SELECT id, group_id FROM member LIMIT 1

构造LIMIT和OFFSET语句

$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,如果提供了无法解析的数值,将被转换为最小值.

构造GROUP BY语句

$qb = wei()->db('member')->groupBy('id, group_id');

// 生成SQL: SELECT * FROM member GROUP BY id, group_id
echo $qb->groupBy();

构造HAVING语句

$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();

构造JOIN语句

$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'
    )
);

注意

  1. indexBy仅对fetchAllfindAll的返回值有作用,execute方法仍然返回原始的数组
  2. 如果字段的值重复,后面的值将覆盖前面的值

调用方式

方法

db($table)

根据数据表名称,创建一个新Query Builder对象

返回: Wei\Record

$qb->select($select = null)

设置SELECT字句要查询的字段名称

返回: Wei\Record

$qb->addSelect($select = null)

增加SELECT子句要查询的字段名称

返回: Wei\Record

$qb->delete($table = null)

设置SQL语句为DELETE操作

返回: Wei\Record

$qb->update($table = null)

设置SQL语句为UPDATE操作

返回: Wei\Record

$qb->from($table)

设置FROM字句的数据表名称

返回: Wei\Record

$qb->where($conditions, $params = null, $types = array())

设置WHERE查询条件

返回: Wei\Record

参数

名称 类型 说明
$conditions string 查询条件,如id = 1, id = ?
$params array 参数的值
$types array 参数的类型

$qb->andWhere($conditions, $params = null, $types = array())

增加AND类型的WHERE条件到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$conditions string 查询条件,如id = 1, id = ?
$params array 参数的值
$types array 参数的类型

$qb->orWhere($conditions, $params = null, $types = array())

增加OR类型的WHERE条件到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$conditions string 查询条件,如id = 1, id = ?
$params array 参数的值
$types array 参数的类型

$qb->orderBy($sort, $order = 'ASC')

设置ORDER BY字句

返回: Wei\Record

参数

名称 类型 说明
$sort string 排序的字段名称
$order string 排序类型,ASCDESC

$qb->addOrderBy($sort, $order = 'ASC')

添加ORDER BY字句到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$sort string 排序的字段名称
$order string 排序类型,ASCDESC

$qb->offset($offset)

设置OFFSET字句

返回: Wei\Record

参数

名称 类型 说明
$offset int OFFSET字句的值,如0,10

$qb->limit($limit)

设置LIMIT字句

返回: Wei\Record

参数

名称 类型 说明
$limit int LIMIT字句的值,如0,10

$qb->page($page)

设置OFFSETLIMIT字句

通过该方法设置$page的值之后,OFFSET的值等于($page - 1) * $limit,如果$limit为空,$limit会被设置为10

返回: Wei\Record

参数

名称 类型 说明
$page int 当前在第几页

$qb->join($table, $on = null)

增加INNER JOIN字句到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$table string 要连接的数据表名称,如userGroup
$on string 连接的关联条件,如user.groupId = userGroup.id

$qb->innerJoin($table, $on = null)

同上,增加INNER JOIN字句到当前查询中

$qb->leftJoin($table, $on = null)

增加LEFT JOIN字句到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$table string 要连接的数据表名称,如userGroup
$on string 连接的关联条件,如user.groupId = userGroup.id

$qb->rightJoin($table, $on = null)

增加RIGHT JOIN字句到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$table string 要连接的数据表名称,如userGroup
$on string 连接的关联条件,如user.groupId = userGroup.id

$qb->groupBy($groupBy)

设置GROUP BY字句

返回: Wei\Record

参数

名称 类型 说明
$groupBy string GROUP BY字句的值

$qb->addGroupBy($groupBy)

添加GROUP BY字句到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$groupBy string GROUP BY字句的值

$qb->having($conditions, $params = array(), $types = array())

设置HAVING字句

返回: Wei\Record

参数

名称 类型 说明
$conditions string 查询条件,如id = 1, id = ?
$params array 参数的值
$types array 参数的类型

$qb->andHaving($conditions, $params = array(), $types = array())

添加AND类型HAVING字句到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$conditions string 查询条件,如id = 1, id = ?
$params array 参数的值
$types array 参数的类型

$qb->orHaving($conditions, $params = array(), $types = array())

添加OR类型的HAVING字句到当前查询中

返回: Wei\Record

参数

名称 类型 说明
$conditions string 查询条件,如id = 1, id = ?
$params array 参数的值
$types array 参数的类型

$qb->indexBy($column)

控制返回二维数组的键名为指定字段的值

返回: Wei\Record

参数

名称 类型 说明
$column string 字段的名称,必须存在select语句中

$qb->resetSqlPart($name)

重置某一部分SQL字句

返回: Wei\Record

参数

名称 类型 说明
$queryPartName string 允许的值为select,from,join,set,where,groupBy,having,orderBy,limitoffset

$qb->resetSqlParts($names = null)

重置某一部分或全部SQL字句

返回: Wei\Record

参数

名称 类型 说明
$queryPartNames null array

$qb->find()

执行构造的SQL语句,并返回一个Wei\Record对象,如果结果为空,返回false

返回: Wei\Record|false

$qb->findAll()

执行构造的SQL语句,并返回一个Wei\Record对象

返回: Wei\Record

$qb->fetch()

执行构造的SQL语句,并返回一个一维数组,如果结果为空,返回false

返回: array|false

$qb->fetchAll()

执行构造的SQL语句,并返回一个二维数组,如果结果为空,返回false

返回: array|false

$qb->count()

获取当前构造的SQL语句所查找到的行数

返回: int

$qb->setParameter($key, $value, $type = null)

设置绑定参数的值和类型

返回: Wei\Record

参数

名称 类型 说明
$key string 参数的名称,对于使用命名占位符的预处理语句,应是类似 :name 形式的参数名。对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。
$value mixed 参数的值
$type int 参数的类型,使用 PDO::PARAM_* 常量明确地指定参数的类型

相关链接: http://php.net/manual/zh/pdostatement.bindvalue.php

$qb->setParameters(array $params, array $types = array())

设置多个绑定参数的值和类型

返回: Wei\Record

$qb->getParameter($key)

获取绑定参数的值

返回: mixed

$qb->getParameters()

获取所有绑定参数的值

返回: array

$qb->getTable()

获取当前查询的数据表名称

返回: string

$qb->getSql()

获取当前查询的完整SQL语句

返回: string

在Record对象从创建,更新到销毁的生命周期中,会触发相应的回调,以便我们更灵活的控制对象数据.

案例

通过beforeCreatebeforeSave回调,为对象自动加上创建和修改时间

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();
        }
    }
}

通过beforeSaveafterSave回调,使数据表字段支持数组格式数据

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']));
    }
}

回调调用顺序

创建新记录并保存

更新已有记录并保存

删除记录

回调方法

afterLoad($record, $wei)

加载记录后触发的回调

beforeSave($record, $wei)

保存记录前触发的回调

afterSave($record, $wei)

保存记录后触发的回调

beforeCreate($record, $wei)

插入记录到数据库前触发的回调

afterCreate($record, $wei)

插入记录到数据库后触发的回调

beforeUpdate($record, $wei)

更新记录到数据库前触发的回调

afterUpdate($record, $wei)

更新记录到数据库后触发的回调

beforeDestroy($record, $wei)

删除记录前触发的回调

afterDestroy($record, $wei)

删除记录后触发的回调

在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

调用方式

方法

$record->isNew()

判断当前记录是否为新建,并且未保存到数据库

$record->isChanged($field = null)

判断当前记录,或指定的字段值是否修改过

$record->getChangedData($field = null)

获取当前记录所有,或指定字段被修改过的值

$record->isDestroyed()

判断当前记录是否已被删除

jQuery Ajax一样调用您的接口

案例

一个完整的例子:获取公开的gists列表

$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']);

指定请求域名的IP地址:通过指向不同的IP地址,访问不同的环境

wei()->http(array(
    'url' => 'http://google.com',
    'ip' => '74.125.128.105', // 线上运营环境
    //'ip' => '127.0.0.1', // 本地开发环境
));

通过切换IP地址简单实现负载均衡

$ips = array(
    '74.125.128.147',
    '74.125.128.105'
);

$http = wei()->http(array(
    'url' => 'http://google.com',
    // 随机使用其中一个IP地址
    'ip' => $ips[array_rand($ips)]
));

自动设置请求地址为referer地址

wei()->http(array(
    'url' => 'http://google.com',
    'referer' => true
));

// referer等于true时,相当于`url`的值

wei()->http(array(
    'url' => 'http://google.com',
    'referer' => 'http://google.com',
));

通过HTTP方法发送请求

此处的get还可以是post, delete, putpatch,表示通过相应的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等数据

为提高响应和解析速度,默认请求是不输出响应头的.

如果需要获取响应头,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证书验证

在开发环境中,如果我们未安装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上关于该问题的讨论和解决方法

http://stackoverflow.com/questions/6400300/php-curl-https-causing-exception-ssl-certificate-problem-verify-that-the-ca-cer

调用方式

选项

名称 类型 默认值 说明
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,serializetext
referer string 请求HTTP头中的referer值
userAgent string 请求HTTP头中的userAgent值
curlOptions array array() 批量设置cURL会话的选项,供curl_setopt_array函数调用
beforeSend callable 在发送请求前触发的回调,可通过该回调更改任意配置
success callable 请求并解析数据成功后触发的回调
error callable 请求或解析失败后触发的回调,可用于记录日志,展示错误信息等
complete callable 请求完成后,不论是否成功都触发的回调,可用于数据记录等

回调

beforeSend($http, $ch)

名称 类型 说明
$http Wei\Http 当前的Http对象
$ch resource cUrl会话的变量

success($data, $http)

名称 类型 说明
$data mixed 解析过的HTTP响应数据,数据类型与dataType选项相关,如下表所示
$http \Wei\Http 当前的Http对象
dataType的值与$data返回的类型
dataType 返回数据类型
json array
jsonObject stdClass
xml SimpleXMLElement
query array
serialize 任意PHP合法类型
text string

error($http, $textStatus, $exception)

名称 类型 说明
$http Wei\Http 当前的Http对象
$textStatus string 简单的错误说明,可能出现的值及出现情况如下表
$exception Exception 错误的异常对象,可通过该对象获取详细的错误信息
$textStatus的值与出现的情况
出现情况
curl cURL内部错误,如无法解析域名IP地址
http HTTP状态码错误,如404页面不存在,500内部错误
parser 数据解析错误,如返回的数据不是正确的json格式

complete($http, $ch)

名称 类型 说明
$http Wei\Http 当前的Http对象
$ch resource cUrl会话的变量

方法

http($options = array())

初始化一个新的Http对象,并执行HTTP请求

返回: Wei\Http 新的http服务对象

http($url, $options = array())

根据给定的URL地址,初始化一个Http对象,并执行HTTP请求

返回: Wei\Http 新的http服务对象

http->isSuccess()

返回请求及数据解析是否成功

返回: bool

http->getCh()

获取cURL的会话变量

返回: resource

http->getData()

获取要发送到服务器的数据

返回: array|string

http->getIp()

获取设置的服务器IP地址

返回: string

http->getMethod()

获取HTTP请求的方式

返回: string

http->getUrl()

获取HTTP请求的URL地址

返回: string

http->getResponseHeader($name)

获取HTTP响应头的值

http->getResponseText()

获取HTTP响应的文本数据

http->setMethod($method)

设置HTTP的请求方式

http->setRequestHeader($name, $value)

设置HTTP请求头的值

http->get($url, $data = array(), $dataType = null)

通过GET方式发送带数据的请求

返回: Wei\Http 新的http服务对象

http->getJson($url, $data = array())

通过GET方式发送带数据的请求,并将返回数据解析为JSON数组

返回: Wei\Http 新的http服务对象

http->getJsonObject($url, $data = array())

通过GET方式发送带数据的请求,并将返回数据解析为JSON对象

返回: Wei\Http 新的http服务对象

http->post($url, $data = array(), $dataType = null)

通过POST方式发送带数据的请求

返回: Wei\Http 新的http服务对象

http->put($url, $data = array(), $dataType = null)

通过PUT方式发送带数据的请求

返回: Wei\Http 新的http服务对象

http->delete($url, $data = array(), $dataType = null)

通过DELETE方式发送带数据的请求

返回: Wei\Http 新的http服务对象

http->patch($url, $data = array(), $dataType = null)

通过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

待验证的数据,可以是数组或对象

验证数据的取值的顺序如下

  1. 如果$data是数组或\ArrayAccess的实例化对象,检查并返回$data[$key]的值
  2. 如果$data是对象,检查属性$key是否存在,存在则返回$data->$key的值
  3. 如果$data是对象且方法get. $key存在,返回$data->{'get' . $key}
  4. 如果以上均不存在,返回null
案例:使用数组或对象作为验证数据
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
));

选项:rules

验证规则数组.

规则可以字符串,表示一项验证规则,也可以是数组,表示多项验证规则.

所有的验证规则请查看API目录-验证器章节.

注意:

  1. 所有数据项默认都是 必选 的,如果某一个数据项是选填的,只需增加 required => false 的验证规则
  2. 验证规则会被转换成对应的类.如email规则将被转换为\Wei\Validator\Email类,如果类不存在,将抛出异常提醒开发人员规则不存在.
  3. 验证规则都是 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',
            )
        )
    )
));
案例:区分验证规则和验证对象的名称
  1. 验证对象均是以is开头,如isDigit,isAlnum
  2. 作为验证规则时,需使用原始的名称,如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,notBlankpresent验证规则

这三个验证规则都用于检查数据不能为空,它们在使用场景和检查的数据内容稍有不同.

使用场景的区别

检查内容的区别

案例:区分allallOf验证规则

规则说明:

它们的区别在于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周岁'

选项:messages

验证错误时的提示信息.提示信息的格式与验证规则类似.

案例:提示信息的格式
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'
            )
        ),
    )
));

选项:names

数据项名称的数组,用于错误信息提示.数组的键名是验证数据项的值,数值的值是验证数据项的名称.如

注意:如果未提供数据项名称,错误信息将以该项作为验证数据项的名称,完整的错误信息例如该项不能为空

案例
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回调.

参数

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回调.

参数

ruleInvalid($rule, $field, $validator, $wei)
名称 类型 说明
$rule string 验证规则的名称
$field string 当前验证的数据项名称
$validator Wei\Validate 验证器对象
$wei Wei\Wei 对象管理器

ruleInvalidruleValid的行为一致. 同样的,如果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回调.

参数

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回调.

参数

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回调.

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回调.

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'

选项:breakRule

默认为false.设置为true后,当任意一项规则验证不通过时就中断验证流程,直接返回验证结果(false)

选项:breakField

默认为false.设置为true后,当任意一项数据验证不通过时就中断验证流程,直接返回验证结果(false)

选项:skip

默认为false.设置为true后,当任意一项数据中的一项规则不通过时,就跳转到下一项数据的验证流程.

因此,每项数据最多会有一个未通过的验证规则

方法

validate($options)

检查数组或对象中每一个元素是否能通过指定规则的验证

返回: Wei\Validate 新的验证器对象

参数

名称 类型 说明
$options array 验证器的选项,完整内容请查看"调用方式"-"选项"章节

validate->addRule($field, $rule, $parameters)

为数据项增加新的验证规则

返回: Wei\Validate 验证器对象

参数

名称 类型 说明
$field string 数据项的名称
$rule string 验证规则的名称
$parameters string 验证规则的参数

validate->hasRule($field, $rule)

检查数据项是否包含指定的验证规则

返回: bool

参数

名称 类型 说明
$field string 数据项的名称
$rule string 验证规则的名称

validate->removeRule($field, $rule)

删除指定数据项的验证规则

返回: bool 规则存在并删除返回true,不存在返回false

参数

名称 类型 说明
$field string 数据项的名称
$rule string 验证规则的名称

validate->setRules(array $rules)

设置验证规则

返回: Wei\Validate 验证器对象

validate->getRules()

获取验证规则

返回: array 验证规则数组

validate->setData($data)

设置要验证的数据

返回: Wei\Validate 验证器对象

validate->getData()

获取要验证的数据

返回: array

validate->setNames($names)

设置数据项的名称

返回: Wei\Validate 验证器对象

validate->getNames()

获取数据项的名称

返回: array

validate->getFieldData($field)

获取要验证的数据项的值

返回: mixed 不存在时返回null

参数

名称 类型 说明
$field string 数据项的名称

validate->setFieldData($field, $value)

设置要验证的数据项的值

返回: Wei\Validate

参数

名称 类型 说明
$field string 数据项的名称
$value mixed 数据项的值

validate->setMessages($messages)

设置自定义的错误信息

返回: Wei\Validate

参数

名称 类型 说明
$messages array 错误信息数组

validate->getMessages()

获取自定义的错误信息

返回: array

validate->getDetailMessages()

获取详细的验证错误信息

返回: array

validate->getSummaryMessages()

获取简洁的验证错误信息

返回: array

validate->getJoinedMessage($separator = "\n")

获取合并的验证错误信息

返回: string

参数

名称 类型 说明
$separator string 合并错误信息数组的分隔符

validate->getFirstMessage()

获取第一条验证错误信息

返回: string|false 验证不通过时返回第一条错误信息,通过时返回false

validate->getRuleValidator($field, $rule)

获取规则验证器对象

返回: 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)组成

方法

isAlnum($input)

检查数据是否只由字母(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%"

方法

isAlpha($input)

检查数据是否只由字母(a-z)组成

相关链接

检查数据是否为空(不允许空格)

案例

检查空白字符会返回成功

$input = '    ';
if (wei()->isBlank($input)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
blankMessage %name%必须为空
negativeMessage %name%不能为空

方法

isBlank($input)

检查数据是否为空(不允许空格)

相关链接

检查数据是否在指定的字符串或正则中

案例

检查"h"是否在"hello"之中

if (wei()->isContains('hello', 'h')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"hello"是否匹配正则"/H/i"

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%

方法

isContains($input, $search, $regex = false)

检查数据是否在指定的字符串或正则中

相关链接

检查数据是否为小数

案例

检查"1.0.0"是否为小数

if (wei()->isDecimal('1.0.0')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
invalidMessage %name%必须是小数
negativeMessage %name%不能是小数

方法

isDecimal($input)

检查数据是否为小数

相关链接

检查数据是否只由数字组成

案例

检查"abc123"是否为数字

if (wei()->isDigit('abc123')) {
    echo 'Yes';
} else {
    echo 'No';
}
// 输出了'No'

调用方式

选项

错误信息

名称 信息
patternMessage %name%只能由数字(0-9)组成
negativeMessage %name%不能只由数字(0-9)组成
notStringSring %name%必须是字符串

方法

isDigit($input)

检查数据是否只由数字组成

相关链接

检查数据是否能被指定的除数整除

案例

检查10能否被3整除

if (wei()->isDivisibleBy(10, 3)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
notDivisibleMessage %name%必须被%divisor%整除
negativeMessage %name%不可以被%divisor%整除

方法

isDivisibleBy($input)

检查数据是否能被指定的除数整除

相关链接

检查数据是否只由双字节字符组成

案例

检查"中文abc"是否只由双字节字符组成

if (wei()->isDoubleByte('中文abc')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
patternMessage %name%只能由双字节字符组成
negativeMessage %name%不能只由双字节字符组成

方法

isDoubleByte($input)

检查数据是否只由双字节字符组成

相关链接

检查数据是否以指定字符串结尾

案例

检查"abc"是否以"C"结尾

if (wei()->isEndsWith('abc', 'C')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

以区分大小写的方式,检查"abc"是否以"C"结尾

if (wei()->isEndsWith('abc', 'C', true)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

检查"abc"是否以数组array('a', 'b', 'c')中的任意元素结尾

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%结尾

方法

isEndsWith($input, $findMe, $case = false)

检查数据是否以指定字符串结尾

相关链接

检查数据是否在指定的数组中

案例

检查"1"是否在array(1, 2, 3)之中

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%

方法

isIn($input, $array, $strict = false)

检查数据是否在指定的数组中

相关链接

检查数据是否为小写字符

案例

检查"abc"是否为小写字符

if (wei()->isLowercase('abc')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
notStringMesssage string %name%必须是字符串 -
invalidMessage string %name%不能包含大写字母 -
negativeMessage string %name%不能包含小写字母 -

方法

isLowercase($input)

检查数据是否为小写字符

返回: bool 检查结果

参数

名称 类型 说明
$input string 要检查的数据

相关链接

检查数据是否符合Luhn算法

Luhn算法常用于信用卡号,防伪码校验.

案例

检查信用卡号是否符合Luhn算法

if (wei()->isLuhn('4111111111111111')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

检查数字"100077858"是否符合Luhn算法

if (wei()->isLuhn('100077858')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
invalidMessage %name%不是有效的数字

方法

isLuhn($input)

检查数据是否符合Luhn算法

返回: bool 检查结果

参数

名称 类型 说明
$input string 要检查的数据

相关链接

检查数据是否为自然数(大于等于0的整数)

案例

检查"0"是否为自然数

if (wei()->isNaturalNumber('0')) {
    echo 'Yes';
} else {
    echo 'No';
}
// 输出了'Yes'

检查"-1"是否为自然数

if (wei()->isNaturalNumber('-1')) {
    echo 'Yes';
} else {
    echo 'No';
}
// 输出了'No'

使用场景

调用方式

选项

错误信息

名称 信息
invalidMessage %name%必须是大于等于0的整数

方法

isNaturalNumber($input)

检查数据是否为自然数(大于等于0的整数)

相关链接

检查数据是否为null

检查0是否为null

if (wei()->isNull(0)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

名称 类型 默认值 说明
notNullMesssage string %name%必须是null值 -
negativeMessage string %name%不能为null值 -

方法

isNull($input)

检查数据是否为null

相关链接

检查数据是否为有效数字

案例

检查-123.4是否为数字

if (wei()->isNumber(-123.4)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
notNumberMessage string %name%必须是有效的数字 -
negativeMessage string %name%不能是数字 -

方法

isNumber($input)

检查数据是否为有效数字

相关链接

检查数据是否为正整数(大于0的整数)

案例

检查"1"是否为正整数

if (wei()->isNaturalNumber('1')) {
    echo 'Yes';
} else {
    echo 'No';
}
// 输出了'Yes'

检查"0"是否为自然数

if (wei()->isNaturalNumber('0')) {
    echo 'Yes';
} else {
    echo 'No';
}
// 输出了'No'

使用场景

调用方式

选项

错误信息

名称 信息
invalidMessage %name%必须是大于0的整数

方法

isPositiveInteger($input)

检查数据是否为正整数(大于0的整数)

相关链接

检查数据是否为空(允许空格)

案例

检查"abc"是否不为空

if (wei()->isPresent('abc')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查空格字符串是否不为空

if (wei()->isPresent(' ')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
emptyMessage %name%必须为空
negativeMessage %name%不能为空

方法

isPresent($input)

检查数据是否不为空(允许空格)

相关链接

检查数据是否匹配指定的正则表达式

案例

检查"abc"是否匹配正则表达式"/d/i"

if (wei()->isRegex('abc', '/d/i')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

名称 类型 默认值 说明
notStringMessage string %name%必须是字符串 -
patternMessage string %name%必须匹配模式"%pattern%" -
negativeMessage string %name%必须不匹配模式"%pattern%" -

方法

isRegex($input)

检查数据是否匹配指定的正则表达式

返回: bool 检查结果

参数

名称 类型 说明
$input string 要检查的数据

相关链接

检查数据是否为空

检查以下值会返回false,其他值(包括0)均返回true

案例

检查null是否为空

if (wei()->isRequired(null)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

检查0是否为空

if (wei()->isRequired(0)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
requiredMessage %name%不能为空
negativeMessage %name%不合法

方法

isRequired($input, $required = true)

检查数据是否为空

相关链接

检查数据是否以指定字符串开头

案例

检查"abc"是否以"C"开头

if (wei()->isEndsWith('abc', 'C')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

以区分大小写的方式,检查"abc"是否以"C"开头

if (wei()->isEndsWith('abc', 'C', true)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

检查"abc"是否以数组array('a', 'b', 'c')中的任意元素开头

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%开头

方法

isStartsWith($input, $findMe, $case = false)

检查数据是否以指定字符串开头

相关链接

检查数据是否为指定的类型

案例

检查"abc"是否为字符串

if (wei()->isType('abc', 'string')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查new ArrayObject()是否为Traversable类型

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 数字 print 可打印字符
object 对象 punct 标点符号
resource 资源 space 空白字符
scalar 标量 upper 大写字母(A-Z)
string 字符串 xdigit 16进制数字

方法

isType($input, $type)

检查数据是否为指定的类型

相关链接

检查数据是否为大写字符

案例

检查"abc"是否为大写字符

if (wei()->isLowercase('abc')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
notStringMessage string %name%必须是字符串 -
invalidMessage string %name%不能包含小写字母 -
negativeMessage string %name%不能包含大写字母 -

方法

isUppercase($input)

检查数据是否为大写字符

相关链接

检查数据的长度是否为指定的数值,或在指定的长度范围内

案例

检查"abc"的长度是否为3

if (wei()->isLength('abc', 3)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"abc"的长度是否在3到6之间

if (wei()->isLength('abc', 3, 6)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

见方法

方法

isLength($input, $min, $max)

检查数据的长度是否在指定的长度范围内

选项
名称 类型 默认值 说明
min int 限制长度的最小值
max int 限制长度的最大值
notDetectdMessage string 无法检测到%name%的长度 -
notInMessage string %name%的长度必须在%min%和%max%之间 -
notInItemMessage string %name%必须包含%min%到%max%项 -
注意: 当检查的数据是字符串时,返回的错误信息是`notIn`,当数据是数组时,返回的是`notInItem`

isLength($input, $length)

检查数据的长度是否为指定的数值

选项
名称 类型 默认值 说明
length int 指定长度的值
notDetectdMessage string 无法检测到%name%的长度 -
lengthMessage string %name%的长度必须是%length% -
lengthItemMessage string %name%必须包含%length%项 -
注意: 当检查的数据是字符串时,返回的错误信息是`length`,当数据是数组时,返回的是`lengthItem`

相关链接

检查数据的 字符数 是否为指定的数值

案例

检查"微框架"的长度是否为3

if (wei()->isCharLength('微框架', 3)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"微框架"的长度是否在3到6之间

if (wei()->isCharLength('微框架', 3, 6)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
charset string UTF-8 验证数据的字符集

方法

isCharLength($input, $min, $max)

检查数据的字符数是否在指定的长度范围内

选项
名称 类型 默认值 说明
min int 限制长度的最小值
max int 限制长度的最大值

错误信息

名称 信息
notDetectdMessage 无法检测到%name%的长度
notInMessage %name%的长度必须在%min%和%max%之间

isCharLength($input, $length)

检查数据的字符数是否为指定的数值

选项
名称 类型 默认值 说明
length int 指定长度的值

错误信息

名称 信息
notDetectdMessage 无法检测到%name%的长度
lengthMessage %name%的长度必须是%length%

相关链接

检查数据的长度是否小于等于指定数值

案例

检查"abc"的长度是否小于等于2

if (wei()->isMaxLength('abc', 2)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

选项

名称 类型 默认值 说明
max int 待比较的数值

错误信息

名称 信息 说明
notDetectdMessage 无法检测到%name%的长度
tooLongMessage %name%的长度必须小于等于%max% 当数据为字符串时出现
tooManayMessage %name%最多包含%max%项 当数据为数组时出现
negativeMessage %name%不合法

方法

isMaxLength($input, $max)

检查数据的长度是否小于等于指定数值

相关链接

检查数据的长度是否大于等于指定数值

案例

检查"abc"的长度是否大于等于2

if (wei()->isMinLength('abc', 2)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
max int 待比较的数值

错误信息

名称 信息 说明
notDetectdMessage 无法检测到%name%的长度
tooShortMessage %name%的长度必须大于等于%min% 当数据为字符串时出现
tooFewMessage %name%至少需要包括%min%项 当数据为数组时出现
negativeMessage %name%不合法

方法

isMinLength($input, $min)

检查数据的长度是否大于等于指定数值

相关链接

检查数据是否等于(==)指定的值

案例

检查指定的两个值是否相等

$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%

方法

isEqualTo($input, $value)

检查数据是否等于(==)指定的值

相关链接

检查数据是否完全等于(===)指定的值

案例

检查指定的两个值是否完全相等

$post = array(
    'password' => '123456',
    'password_confirmation' => '123456',
);

if (wei()->isIdenticalTo($post['password'], $post['password_confirmation'])) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查0false是否完全相等

if (wei()->isIdenticalTo(0, false)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

名称 类型 默认值 说明
value mixed 与数据比较的值

错误信息

名称 信息
invalidMessage %name%必须等于%value%
negativeMessage %name%不能等于%value%

方法

isIdenticalTo($input, $value)

检查数据是否完全等于(===)指定的值

相关链接

检查数据是否大于(>)指定的值

案例

检查10是否大于20

if (wei()->isGreaterThan(10, 20)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

名称 类型 默认值 说明
value mixed 待比较的数值

错误信息

名称 信息
invalidMessage %name%必须大于%value%
negativeMessage %name%不合法

方法

isGreaterThan($input, $value)

检查数据是否大于(>)指定的值

相关链接

检查数据是否大于等于(>=)指定的值

案例

检查10是否大于等于20

if (wei()->isGreaterThanOrEqual(10, 20)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

名称 类型 默认值 说明
value mixed 待比较的数值

错误信息

名称 信息
invalidMessage %name%必须大于等于%value%
negativeMessage %name%不合法

方法

isGreaterThanOrEqual($input, $value)

检查数据是否大于等于(>=)指定的值

相关链接

检查数据是否小于(<)指定的值

案例

检查10是否小于20

if (wei()->isLessThan(10, 20)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
value mixed 待比较的数值
invalidMessage string %name%必须小于等于%max% -
negativeMessage string %name%必须不小于等于%max% -

方法

isLessThan($input, $value)

检查数据是否小于(<)指定的值

相关链接

检查数据是否小于等于(<=)指定的值

案例

检查10是否小于等于20

if (wei()->isLessThanOrEqual(10, 20)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
value mixed 待比较的数值

错误信息

名称 信息
invalidMessage %name%必须小于等于%max%
negativeMessage %name%必须不小于等于%max%

方法

isLessThanOrEqual($input, $value)

检查数据是否在指定的两个值之间

相关链接

检查数据是否在指定的两个值之间,不包含值本身($min < $input < $max)

案例

检查18是否在1到10之间

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%之间

方法

isBetween($input, $min, $max)

检查数据是否在指定的两个值之间

相关链接

检查数据是否为合法的日期

案例

检查"2013-01-01"是否为合法的日期

if (wei()->isDate('2013-01-01')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"2046-01-01"是否在今天之前(不包含今天)

if (wei()->isDate('2046-01-01', array('before' => date('Y-m-d')))) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

检查"2046-01-01"是否在今天之后(不包含今天)

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%不能是合法的日期

方法

isDate($input, $format = 'Y-m-d')

检查数据是否为合法的日期

isDate($input, $options = array())

检查数据是否为合法的日期,第二个参数为选项数组

相关链接

检查数据是否为合法的日期时间

案例

检查"2013-01-01 10:00"是否为合法的日期时间

if (wei()->isDateTime('2013-01-01 10:00')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"2013-01-01"是否为符合格式"Ymd"的日期时间

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函数的格式说明.

方法

isDateTime($input, $format = 'Y-m-d H:i:s')

检查数据是否为合法的日期时间

相关链接

检查数据是否为合法的时间

案例

检查"12:00:00"是否为合法的时间

if (wei()->isTime('12:00:00')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"12:00"是否为符合格式"i:s"的时间

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函数的格式说明.

方法

isTime($input, $format = 'H:i:s')

检查数据是否为合法的时间

相关链接

检查数据是否为存在的目录

案例

检查"/notfound/directory"是否为存在的目录

if (wei()->isDir('/notfound/directory')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
notFoundMessage %name%必须是存在的目录
negativeMessage %name%必须是不存在的目录

方法

isDir($input)

检查数据是否为存在的目录

相关链接

检查数据是否为存在的文件或目录

案例

检查路径"/notfound/directory"是否存在

if (wei()->isExists('/notfound/directory')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
notFoundMessage %name%必须是存在的文件或目录
negativeMessage %name%必须是不存在的文件或目录

方法

isExists($input)

检查数据是否为存在的文件或目录

相关链接

检查数据是否为合法的文件,可选的检查选项有文件大小,扩展名和媒体类型

案例

检查文件"5x5.gif"是否为存在且大小小于1.2mb

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%必须是不存在的文件

方法

isFile($input, $options)

检查数据是否为合法的文件,可选的检查选项有文件大小,扩展名和媒体类型

第一个参数$input允许以下3种变量类型.

  1. 字符串,变量的值是文件的路径,可以是相对路径,也可以是绝对路径
  2. 数组,确切的说是来自文件上传变量$_FILES的子数组,该数组应该至少包括tmp_namename两个键
  3. \SplFile对象

相关链接

检查数据是否为图片,同时还可以检查图片宽度和高度是否在指定的范围内

案例

检查文件"5x5.gif"是否为图片且最大高度不能超过5px

if (wei()->isImage('./5x5.gif', array('maxWidth' => 5))) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查文件"5x5.gif"是否为图片且后缀名不能为"gif"

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

方法

isImage($input, $options = array())

检查数据是否为图片,同时还可以检查图片宽度和高度是否在指定的范围内

图片验证器是文件验证器isFile的子类,其中选项maxSize, minSize, exts, excludeExts, mimeTypes, excludeMimeTypes继承自父类.

相关链接

检查数据是否为有效的邮箱地址

案例

检查"example@example.com"是否为邮箱地址

if (wei()->isEmail('example@example.com')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
formatMessage %name%必须是有效的邮箱地址
negativeMessage %name%不能是数字

方法

isEmail($input)

检查数据是否为有效的邮箱地址

相关链接

检查数据是否为有效的IP地址

案例

检查"192.168.0.1"是否为有效的IP地址

if (wei()->isIp('192.168.0.1')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"192.168.0.1"是否不在私有的IP地址中

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地址

方法

isIp($input, $options = array())

检查数据是否为有效的IP地址

相关链接

检查数据是否为存在的顶级域名

案例

检查"cn"是否为存在的顶级域名

if (wei()->isTld('cn')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
notInMessage %name%必须是有效的顶级域名
negativeMessage %name%不能是有效的顶级域名

方法

isTld($input)

检查数据是否为存在的顶级域名

相关链接

检查数据是否为有效的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地址

方法

isUrl($input, $options = array())

检查数据是否为有效的URL地址

相关链接

检查数据是否为有效的UUID

案例

检查"00010203-0405-0607-0809-0A0B0C0D0E0F"是否为有效的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 -

方法

isUuid($input)

检查数据是否为有效的UUID

相关链接

检查数据是否为合法的信用卡号码

案例

检查数据是否为Visa或银联卡,第二个参数即可以是字符串,也可以是数组

$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%不能是有效的信用卡号

方法

isCreditCard($input, $type = null)

检查数据是否为合法的信用卡号码

相关链接

检查数据是否为有效的电话号码(由数字,+,-和空格组成)

案例

检查"020-1234567"是否为电话号码

if (wei()->isPhone('020-1234567')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"020-1234567"是否为电话号码

if (wei()->isPhone('abc-1234567')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

错误信息

名称 信息
notStringMessage %name%必须是字符串
patternMessage %name%必须是有效的电话号码
negativeMessage %name%不能是电话号码

方法

isPhone($input)

检查数据是否为有效的电话号码

相关链接

检查数据是否只由汉字组成

案例

检查数据是否只由汉字组成

if (wei()->isChinese('中文')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
patternMessage %name%只能由中文组成
negativeMessage %name%不能只由中文组成

方法

isChinese($input)

检查数据是否只由汉字组成

相关链接

检查数据是否为有效的中国身份证

案例

检查15位数字"342622840209049"是否为有效的中国身份证

if (wei()->isIdCardCn('342622840209049')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
invalidMessage %name%必须是有效的中国身份证
negativeMessage %name%不能是有效的中国身份证

方法

isIdCardCn($input)

检查数据是否为有效的中国身份证

相关链接

检查数据是否为有效的香港身份证

案例

检查"Z437626A"是否为有效的香港身份证

if (wei()->isIdCardHk('Z437626A')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
invalidMessage %name%必须是有效的香港身份证
negativeMessage %name%不能是有效的香港身份证

方法

isIdCardHk($input)

检查数据是否为有效的香港身份证

相关链接

检查数据是否为有效的澳门身份证

案例

检查"11111111"是否为有效的澳门身份证

if (wei()->isIdCardMo('11111111')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
notStringMessage string %name%必须是字符串 -
patternMessage string %name%必须是有效的澳门身份证 -
negativeMessage string %name%不能是有效的澳门身份证 -

方法

isIdCardMo($input)

检查数据是否为有效的澳门身份证

相关链接

检查数据是否为有效的台湾身份证

案例

检查"A122501945"是否为有效的台湾身份证

if (wei()->isIdCardTw('A122501945')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
invalidMessage %name%必须是有效的台湾身份证
negativeMessage %name%不能是有效的台湾身份证

方法

isIdCardTw($input)

检查数据是否为有效的台湾身份证

相关链接

检查数据是否为有效的中国电话号码

案例

检查"020-1234567"是否为电话号码

if (wei()->isPhoneCn('020-1234567')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

错误信息

名称 信息
notStringMessage %name%必须是字符串
patternMessage %name%必须是有效的电话号码
negativeMessage %name%不能是电话号码

方法

isPhoneCn($input)

检查数据是否为有效的电话号码

相关链接

检查数据是否为有效的中国车牌号码

案例

检查"京A12345"是否为有效的车牌号码

if (wei()->isPlateNumberCn('京A12345')) {
    echo 'Yes';
} else {
    echo 'No';
}
运行结果
'Yes'

检查"粤A12345"是否为广东的车牌号码

$number = '粤A12345';
if (wei()->isStartsWith($number, '粤') && wei()->isPlateNumberCn($number)) {
    echo 'Yes';
} else {
    echo 'No';
}
运行结果
'Yes'

调用方式

选项

错误信息

名称 信息
patternMessage %name%必须是正确的车牌格式
negativeMessage %name%不能是正确的车牌格式
notStringMessage %name%必须是字符串

方法

isPlateNumberCn($input)

检查数据是否为有效的中国车牌号码

相关链接

检查数据是否为有效的中国邮政编码

案例

检查"123456"是否为有效的中国邮政编码

if (wei()->isPostcodeCn('123456')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
notStringMessage string %name%必须是字符串 -
patternMessage string %name%必须是6位长度的数字 -
negativeMessage string %name%不能是邮政编码 -

方法

isPostcodeCn($input)

检查数据是否为有效的中国邮政编码

相关链接

检查数据是否为有效的QQ号码

案例

检查"123456"是否为有效的QQ号码

if (wei()->isQQ('123456')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

检查"0123456"是否为有效的QQ号码

if (wei()->isQQ('0123456')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
patternMessage %name%必须是有效的QQ号码
negativeMessage %name%不能是QQ号码

方法

isQQ($input)

检查数据是否为有效的QQ号码

相关链接

检查数据是否为有效的中国手机号码

案例

检查"13800138000"是否为有效的手机号码

if (wei()->isMobileCn('13800138000')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
patternMessage %name%必须是11位长度的数字,以13,14,15或18开头

方法

isMobileCn($input)

检查数据是否为有效的中国手机号码

相关链接

检查数据是否通过所有的规则校验

案例

检查数据是否为5-10位的数字

$input = '123456';
if (wei()->isAllOf($input, array(
    'length' => array(5, 10),
    'digit' => true
))) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
rules array - 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项

错误信息

名称 信息
atLeastMessage %name%必须满足以下所有规则

方法

isAllOf($input, $rules)

检查数据是否通过所有的规则校验

相关链接

检查数据是否不符合所有指定的规则校验

案例

检查数据不为数字,且长度不大于3

$rules = array(
    'alpha' => true,
    'maxLength' => 3
);
if (wei()->isNoneOf('abc', $rules)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

名称 类型 默认值 说明
rules array - 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项
invalidMessage string %name%必须满足以下所有规则 -

方法

isNoneOf($input, $rules)

检查数据是否不符合所有指定的规则校验

相关链接

检查数据是否满足指定规则中的任何一条

案例

检查"abc"是否为数字且最大长度不超过2

$rules = array(
    'digit' => true,
    'maxLength' => 2
);
if (wei()->isOneOf('abc', $rules)) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

名称 类型 默认值 说明
rules array - 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项

错误信息

名称 信息
atLeastMessage %name%至少需要满足以下任何一条规则

方法

isOneOf($input, $rules)

检查数据是否满足指定规则中的任何一条

相关链接

检查数据是否通过指定数量规则的验证

案例

检查数据符合"数字,长度小于5,邮箱"这三条中至少两条

$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%条 -

方法

isSomeOf($input, $rules, $atLeast)

检查数据是否通过指定数量规则的验证

相关链接

检查数据表是否存在指定的记录

案例

检查主键为1的用户是否存在,和检查name为test的用户是否存在

// 配置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%已存在

方法

isRecordExists($input, $table, $field = 'id')

检查数据表是否存在指定的记录

相关链接

检查数组里的每一项是否符合指定的规则

案例

检查数组里的每一项是否都为数字

$input = array(3, 2, 5);
if (wei()->isAll($input, array(
    'digit' => true
))) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

名称 类型 默认值 说明
rules array - 验证规则数组,数组的键名是规则名称,数组的值是验证规则的配置选项

错误信息

名称 信息
notArrayMessage %name%必须是数组

方法

isAll($input, $rules)

检查数组里的每一项是否符合指定的规则

相关链接

检查数据是否通过指定回调方法验证

案例

通过回调方法检查数据是否能被3整除

if (wei()->isCallback(3, function($input) {
    return 0 === 10 % $input;
})) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'No'

调用方式

选项

错误信息

名称 信息
invalidMessage %name%不合法

方法

isCallback($input, $fn, $message = null)

检查数据是否通过指定回调方法验证

名称 类型 默认值 说明
$input mixed 待验证的数据
$fn callback 指定验证的回调结构
$message string 自定义验证不通过的提示信息

相关链接

检查数据是否为有效的十六进制颜色

案例

检查"#FF0000"是否为有效的十六进制颜色

if (wei()->isColor('#FF0000')) {
    echo 'Yes';
} else {
    echo 'No';
}

运行结果

'Yes'

调用方式

选项

错误信息

名称 信息
notStringMessage %name%必须是字符串
patternMessage %name%必须是有效的十六进制颜色,例如#FF0000
negativeMessage %name%不能是有效的十六进制颜色

方法

isColor($input)

检查数据是否为有效的十六进制颜色

相关链接

检查组成密码的字符是否符合要求格式

案例

检查密码是否最少包含6个字符,由数字和字母组成

$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';

推荐的选项组合

调用方式

选项

名称 类型 默认值 说明
minLength int 密码的最小长度,常用68
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%种

方法

isPassword($input)

检查组成密码的字符是否符合要求格式

相关链接

管理HTTP请求数据($_REQUEST)

案例

获取HTTP请求参数的值

// 假设 $_REQUEST['id'] = 5;

// 返回5
$id = wei()->request('id');

获取当前请求的URL地址

$url = wei()->request->getUrl();

检查当前请求是否由Ajax发起

if (wei()->request->inAjax()) {
    // do something
}

获取服务器IP地址

// 假设 $_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请求方式

方法

request($name, $default = null)

获取HTTP请求参数的字符串值

request->getRaw($name, $default = null)

获取HTTP请求参数的原始值

request->getScheme()

获取URL scheme的值,返回结果为httphttps

request->getHost()

获取主机的名称,通过域名访问则返回域名地址,通过IP地址访问则返回IP地址

request->getRequestUri()

获取请求的URI地址

request->getBaseUrl()

获取基本URL地址

request->getPathInfo()

获取请求的路径信息,一般用于路由器解析

request->getUrl()

获取用户访问的完整URL地址

request->getIp()

获取访问用户的IP地址

request->getMethod()

获取HTTP请求方式,默认为GET

request->setMethod($method)

设置HTTP请求方式,可以通过该接口设置请求为PUT,DELETE等等

request->isMethod($method)

检查HTTP请求方式是否为$method

request->isGet()

检查HTTP请求方式是否为GET

request->isPost()

检查HTTP请求方式是否为POST

request->isAjax()

检查当前是否为ajax(XMLHttpRequest)请求

管理用户会话信息

案例

使用Session存储验证码,并校验请求的验证码是否正确

验证码页面

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)

设置会话信息的值

session->get($key)

获取会话信息的值,同session($key)

session->set($key, $value)

设置会话信息的值,同session($key, $value)

session->remove($key)

删除指定会话名称

session->exists($key)

检查指定会话名称是否存在

session->clear()

删除当前命名空间的会话信息

session->destory()

删除所有的会话信息

session->toArray();

获取当前命名空间下所有会话信息

检测客户端浏览器,操作系统和设备是否为指定的名称和版本

案例

检查用户是否为iPhone或Android手机

if (wei()->ua->isIPhone()) {
    // do something
} elseif (wei()->ua->isAndroid()) {
    // do something
}

根据用户设备跳转到相应的页面

if (wei()->ua->isIPhone()) {
    // 跳转到iPhone定制页面
} elseif (wei()->ua->isIPad()) {
    // 跳转到iPad定制页面
} else {
    // 展示默认页面
}

获取Windows Phone手机用户的版本

echo wei()->ua->getVersion('WindowsPhone');

如果用户为IE浏览器,输出用浏览器版本

if (wei()->ua->isIE()) {
    echo wei()->ua->getVersion('ie');
}

运行结果

'10.0'

调用方式

选项

方法

ua($name)

检测客户端是否为指定的浏览器,操作系统和手持设备

ua->is($name)

ua($name)

ua->getVersion($name)

获取客户端浏览器,操作系统或手持设备的版本

ua->isMobile()

检查用户是否通过移动设备访问

ua->isIE()

检查用户是否通过IE浏览器访问

ua->isChrome()

检查用户是否通过Chrome浏览器访问

ua->isFirefox()

检查用户是否通过Firefox浏览器访问

ua->isIOS()

检查用户是否使用苹果iOS系统

ua->isAndroid()

检查用户是否使用谷歌安卓系统

ua->isWindowsPhone()

检查用户是否使用微软Windows Phone系统

ua->isIPhone()

检查用户是否使用iPhone/iPod访问网站

ua->isIPad()

检查用户是否使用iPad访问网站

保存客户端上传的文件到指定目录

案例

上传单个文件

$result = wei()->upload();
if ($result) {
    echo 'Yes';
} else {
    print_r(wei()->upload->getMessages());
}

上传图片文件,限定宽度和高度小于2000px

$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%必须是字符串 -

方法

upload($options)

上传一个文件

upload->getMessages()

获取错误信息

发送HTTP响应头和响应内容

案例

发送内容为"Hello World"的HTTP响应

wei()->response('Hello World');

// 运行结果
'Hello World'

获取上面案例中HTTP响应的完整内容

echo (string)wei()->response;

// 运行结果
'HTTP/1.1 200 OK

Hello World'

输出JSON格式的数据

wei()->response(array(
    'code' => 1,
    'message' => '操作成功!'
));

// 运行结果
'{"code":1,"message":"\u64cd\u4f5c\u6210\u529f!"}'

结果截图:

发送JSON数据

输出JSONP格式的数据

wei()->response->jsonp(array(
    'code' => 1,
    'message' => '操作成功!'
));

// 假设URL请求地址为 index.php?callback=callback,运行结果为
'callback({"code":1,"message":"\u64cd\u4f5c\u6210\u529f!"})'

结果截图:

发送JSON数据

注意

只要符合正则/^[$A-Z_][0-9A-Z_$.]*$/i都会认为是合法的callback值.

等待3秒后跳转到谷歌首页

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__);

结果截图:

弹出下载对话框

逐个打印1-10的数字到浏览器窗口,每隔一秒输出一个

// 关闭缓冲区,发送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 在发送响应后调用的回调

选项: cookieOption

名称 类型 默认值 说明
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

选项: downloadOption

名称 类型 默认值 说明
filename string null 弹出下载对话框时显示的文件名称
type string application/x-download 指定HTTP内容类型(Content-Type)
disposition string attachment 下载的方式,可选项为inlineattachment,如果是inline,浏览器会先尝试直接在浏览器中打开,如果是attachment,浏览器将直接弹出下载对话框

回调: beforeSend($response, $content)

名称 类型 说明
$response Wei\Response 当前HTTP响应对象
$content string 发送响应的内容

回调: afterSend($response)

名称 类型 说明
$response Wei\Response 当前HTTP响应对象

方法

response($content, $status = null)

发送HTTP响应头和响应内容

名称 类型 默认值 说明
$content string HTTP响应的内容
$stateCode int 200 HTTP响应的状态码

response->setContent($content)

设置HTTP响应的内容

response->getContent()

获取HTTP响应的内容

response->setStatusCode($code, $text = null)

设置HTTP响应的状态码

response->setStatusCode()

获取HTTP响应的状态码

response->setSentStatus($bool)

设置内容是否已发送

response->download($file, $downloadOptions = array())

下载指定的文件

response->flush($content = null, $status = null)

关闭缓冲区,让后台脚本实时输出内容到浏览器

response->json($data)

输出JSON格式的数据到浏览器

response->jsonp($data)

输出JSON或JSONP格式的数据到浏览器

response->redirect($url, $statusCode = 302, $options)

跳转到指定的网址

生成带版本号的资源(CSS, JS, 图片等素材文件)URL地址,解决浏览器缓存资源文件的问题

案例

生成带版本号的资源URL地址,解决浏览器缓存资源文件的问题

// 在配置文件中设置资源版本号
wei(array(
    'asset' => array(
        'version' => '1'
    )
));

// 在视图中使用asset服务生成URL地址
echo wei()->asset('style.css');

// 输出的URL地址类似
'/style.css?v=1'

自定义资源的基础URL地址

如果生成的资源地址不符合您的项目路径,你可以通过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';

生成不带版本号的URL地址

有时生成文件路径用于检查资源文件是否存在,可以设置第二个参数为false,即生成不带版本号的路径.

$file = wei()->asset('styele.css', false);

if (file_exists($file)) {
    // do something
}

调用方式

选项

名称 类型 默认值 说明
baseUrl string / 资源的基础URL地址
version string 1 自动附加到URL结尾的版本号码,如果要关闭,设置为false即可

方法

asset($file, $version = true)

生成指定文件的资源URL地址

asset->getBaseUrl()

获取资源的基础URL地址

asset->setBaseUrl($baseUrl)

设置资源的基础URL地址

E,即Escaper,用于转义特殊字符,以便安全的输出到网页中,防止XSS攻击.

支持HTML,JS,CSS,HTML属性和URL的转义.

案例

转义HTML字符串

echo wei()->e('<script>alert("xss")</script>');

// 运行结果
'&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'

转义Javascript字符串

echo wei()->e->js('bar&quot;; alert(&quot;Meow!&quot;); var xss=&quot;true');

// 运行结果
'bar\x26quot\x3B\x3B\x20alert\x28\x26quot\x3BMeow\x21\x26quot\x3B\x29\x3B\x20var\x20xss\x3D\x26quot\x3Btrue'

转义CSS字符串

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 '

转义HTML属性字符串

echo '<span title=';
echo wei()->e->attr("faketitle onmouseover=alert(/xss/);");
echo '>hi</span>';

// 运行结果
'<span title=faketitle&#x20;onmouseover&#x3D;alert&#x28;&#x2F;xss&#x2F;&#x29;&#x3B;>hi</span>'

转义URL字符串

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 要转义内容的编码,应该与页面编码一致

方法

e($input, $type = 'html')

转义HTML字符串

e->html($input)

转义HTML字符串

e->js($input)

转义Javascript字符串

e->css($input)

转义CSS字符串

e->attr($input)

转义HTML属性字符串

e->url($input)

转义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>') ?>

输出结果的源码

&lt;a href=&quot;xss&quot;&gt;Click me!&lt;/a&gt;

自定义视图助手

// 定义名称为`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())

渲染指定名称的模板

view->render($name, $vars = array())

渲染指定名称的模板,同view($name, $vars = array())

view->display($name, $vars = array())

渲染并输出指定名称的模板

view->assign($name, $value)

设置视图变量

view->get($name)

获取视图变量

view->getFile()

获取模板文件

view->layout($name, $variable = 'content')

设置模板的父模板名称

view->setDirs($dirs)

设置模板所在的目录

创建并运行一个MVC应用

案例

创建一个MVC应用

演示:创建一个MVC应用

提示"controller "xxx" (class "yyy") not found"的解决的方法

  1. 检查类"yyy"是否存在
  2. 检查类是否设置了自动加载

链接: 设置类自动加载

提示"action method "xxx" not found in controller "xxx" (class "xxx")"的解决方法

  1. 检查控制器类是否存在与action名称一样的方法
  2. 检查方法名称是否为public
  3. 检查方法名称和action名称的大小写是否一致
  4. 检查方法名称是否不以下划线"_"开头

如下控制器,假设访问 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 默认的行为名称

方法

app($options)

根据提供的选项,创建一个MVC应用,执行相应的行为方法,并输出视图数据

app->getController()

获取当前应用的控制器名称

app->setController($controller)

设置当前应用的控制器名称

app->getAction()

获取当前应用的行为名称

app->setAction($action)

设置当前应用的行为名称

app->getControllerClass($controller)

获取指定控制器的完整类名(不检查类名是否存在)

app->getDefaultTemplate()

获取当前控制器和行为对应的视图文件路径

app->preventPreviousDispatch()

中断当前的应用逻辑

app->forward($action, $controller = null)

中断当前的应用逻辑,并跳转到指定的控制器和行为

配置数据管理

案例

设置和获取配置

// 设置配置项'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);

输出HTML option标签

echo wei()->config->toOptions('yesOrNo');

// 输出
'<option value="y">是</option><option value="n">否</option>';

输出JSON数据

echo wei()->config->toJson('yesOrNo');

// 输出
'{"y":"\u662f","n":"\u5426"}';

调用方式

选项

方法

wei()->setConfig($name, $default = null)

设置配置

wei()->getConfig($name, $value)

获取配置

config->toJson($name)

转换配置为JSON字符串

config->toOptions($name)

转换配置为HTML下拉菜单选项

计数器服务,可用于记录用户操作次数,判断用户是否执行了某项操作等

案例

配置计数器服务

计数器服务依赖于缓存服务,您可以通过providers选项配置.

推荐配置的缓存服务:redis,dbCache等.

wei(array(
    'lock' => array(
        'providers' => array(
            'cache' => 'redis'
        )
    )
));

注意

应根据计数数据的重要性,选择持久性缓存或非持久性缓存.

调用方式

选项

方法

counter->incr($key, $offset = 1)

增加一个计数器的值

counter->decr($key, $offset = 1)

减少一个计数器的值

counter->get($key)

获取一个计数器的值

counter->set($key, $value)

设置一个计数器的值

counter->exits($key)

检查一个计数器是否存在

counter->remove($key)

移除一个计数器

环境检测及根据不同环境加载不同的配置文件

案例

在初始化时根据环境加载配置

$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%会替换成当前的环境名称

环境名称的检测顺序

  1. 如果用户设置了env选项,使用env作为环境名称
  2. 如果用户设置了回调结构detector选项,调用detector获取返回值
  3. 如果返回值为false继续到第4步,否则将返回值作为环境名称
  4. 如果当前的服务器IP地址在ipMap的键名之中,使用对应的值作为环境名称
  5. 使用prod作为环境名称

方法

env()

获取环境名称

env->getEnv()

获取环境名称

env->is($env)

检查是否为指定的环境名称

env->isDev()

检查是否为开发环境

env->isTest()

检查是否为测试(Beta,演示)环境

env->isProd()

检查是否为生产(线上)环境

env->setName($name)

设置环境名称

env->getName()

获取当前环境名称

错误处理器,可自定义异常,404和fatal错误的处理

案例

自定义404错误页面

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 是否忽略已有的异常处理器

方法

error($fn)

设置自定义的错误处理器

处理器的参数如下表.

名称 类型 说明
$exception Exception 异常对象
$wei Wei\Wei 对象管理器

error->notFound($fn)

设置404的错误处理器

error->fatal($fn)

设置Fatal错误的处理器

根据邮箱地址生成自定义大小的Gravatar头像

案例

生成默认大小(80px)的Gravatar头像

echo '<img src="' . wei()->gravatar('twinhuang@qq.com') . '" />';

页面显示效果

生成预设定大小的Gravatar头像

// 输出较小尺寸(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, monsteridwavatar),也可以自定义的图片地址
secure bool false 是否输出HTTPS协议的图片地址
size int 80 默认的头像图片大小
smallSize int 48 自定义的小头像图片大小
largeSize int 200 自定义的大头像图片大小

方法

gravatar($email, $size = null, $default = null, $rating = null)

根据邮箱地址生成自定义大小的Gravatar头像

gravatar->small($email, $default = null, $rating = null)

根据邮箱地址生成较小尺寸(48px)的Gravatar头像

gravatar->large($email, $default = null, $rating = null)

根据邮箱地址生成较大尺寸(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'
        )
    )
));

调用方式

选项

方法

lock($key)

对指定的键名加锁

返回 bool 成功时返回true,失败返回false

lock->release($key)

对指定的键名解锁

返回 bool 键名存在时返回true,不存在时返回false

lock->releaseAll()

释放当前请求所有的锁

记录日志到文件中

案例

记录一条DEBUG级别的日志

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');

输出结果

输出日志到浏览器

将请求URL地址等信息附加到每条日志中

$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,fileFormatfileSize选项生成,不留空的话需设置fileDetected才有效
fileDetected bool false 日志文件路径是否已确认,与file选项搭配使用
context array array() 附加到每条日志的默认内容,如用户IP地址,请求URL地址等

日志等级及使用场景

名称 级别 使用场景
debug 具体的调试信息,如某个函数被调用了,某个参数的值,主要用于调试
info 有用的信息,如某某用户登录了,SQL日志
warning 个别情况出现的信息,例如使用废弃的接口,接口使用场景错误,配置错误
error 运行中的错误,不需要马上处理,但应该被记录及监控,如邮件发送失败
critical 严重的情况,如某个组件不可用,未捕获的异常
alert 必须马上处理的情况,如网站打不开,数据库连不上,这种情况下应该发送短信通知你处理!

日志等级及说明来自于Monolog

除了上面之外,还有notice和emergency级别,因不推荐使用,且为避免混淆,不一一详细说明.

方法

logger($level, $message)

记录一条日志

logger->debug($message)

记录一条DEBUG等级的日志

logger->info($message)

记录一条info等级的日志

logger->warning($message)

记录一条warning等级的日志

logger->error($message)

记录一条error等级的日志

logger->critical($message)

记录一条critical等级的日志

logger->alert($message)

记录一条alert等级的日志

logger->getFile()

获取日志文件

logger->setLevel($level)

设置默认的日志等级

logger->setHandledLevel($level)

设置记录的最低日志等级

logger->setContext($name, $value)

设置一项日志附加信息

logger->setContext(array $context)

设置多项日志附加信息

logger->clean()

删除日志目录下的所有文件(注意谨慎使用)

安全简单的密码加密,校验服务

基于ircmaxell/password_compat

案例

保存注册用户的密码

// 获取表单提交的密码字符串
$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之间

方法

password->hash($password, $salt = null)

加密密码

返回: string 60个字符长度的字符串

password->verify($password, $hash)

检查密码是否正确

返回: boolean

password->generateSalt()

生成适合密码加密的盐(干扰字符串)

返回: string 22个字符长度的字符串

password->getInfo($hash)

获取加密密码的加密信息

返回: array

相关链接

将中文转换为拼音字母

案例

转换"微框架"为拼音字母

// 输出`PHPweikuangjia`
echo wei()->pinyin('PHP微框架');

调用方式

选项

方法

pinyin($word)

将中文转换为拼音字母

返回: string 拼音字母

参数

名称 类型 说明
$word string 要转换的中文字符

生成一个随机的UUID

案例

随机生成一个UUID

// 输出格式类似"05b59eca-866d-410b-96d7-e4f2c286f5a8"
echo wei()->uuid();

调用方式

选项

方法

uuid()

生成一个随机的UUID

生成的UUID可用于数据表主键,相比通过SQL语句SELECT UUID生成的UUID要快很多,而且调用更加方便.

PHP Error提供了更友好的错误提示信息,完整的语法和代码片段高亮,同时支持Ajax错误提示

案例

在Widget初始化时加载PHP Error

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

方法

phpError()

获取\php_error\ErrorHandler对象

Back to top