# ENPHP **Repository Path**: wfdaj/ENPHP ## Basic Information - **Project Name**: ENPHP - **Description**: No description available - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-10-24 - **Last Updated**: 2024-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### ENPHP Framework是一个轻量级的,开包即用的PHP开源框架 ENPHP非常适合中小型web应用的开发设计,内置数据验证,多数据库分离,Redis,数据缓存,会话认证,中间件等支持及常用的库函数。 以优化80%重复功能为目标设计的全栈框架。 ### 版本库依赖 > PHP7+
> mb_string扩展 ### 文档目录索引 #### 常量配置 ||||| |---|---|---|---| |[入口文件配置](#入口文件配置)| [常量设置](#常量设置) | [数据库配置](#数据库配置) | [全局变量数组](#全局变量数组)| #### 框架基本使用 |||| |---|---|---| |[Controller控制器](#Controller控制器) | [View视图](#View视图)| [Model数据模型](#Model数据模型)| #### 框架核心组建 ||||| |---|---|---|---| | [Input输入](#Input输入)| [Output输出](#Output输出) | [Session会话](#Session会话) | [Cookie管理](#Cookie管理)| #### 数据库操作 |||| |---|---|---| |[数据库基本操作](#数据库基本操作)| [Model数据对象](#Model数据对象)| [Model数据验证](#Model数据验证) | #### 缓存 ||| |---|---| |[Redis缓存](#Redis缓存) | [Cache缓存](#Cache缓存) | #### 安全认证 |||| |---|---|---| |[Authorize认证](#Authorize认证) | [Security安全](#Security安全) | [Captcha验证码生成](#Captcha验证码生成)| |||||| #### 库函数 |||| |---|---|---| |[Upload上传文件](#Upload上传文件) |[Html标签生成](#Html标签生成)|[Grid表格生成](#Grid表格生成) | |[Image图片修饰](#Image图片修饰) |[Smtp发送邮件](#Smtp发送邮件) |[Captcha验证码生成](#Captcha验证码生成)| 文档内容 ==== ### 入口文件配置 > 入口文件一般是网站的根目录index.php文件,有几个重要的常量配置。 #### 运行环境设置 设置运行环境变量,三个值分别为测试环境,产品环境,开发环境。 ```php // test,production,development define('ENVIRONMENT', 'development'); ``` #### 应用目录设置 ```php define('APP_DIR', realpath('app_dir') . DIRECTORY_SEPARATOR); ``` #### 框架目录设置 ```php define('SYS_DIR', realpath('system_dir') . DIRECTORY_SEPARATOR); ``` #### 控制器模块目录设置 设置controller模块目录常量,模块必须是APP_DIR目录下module文件夹的子目录。 ```php define('MODULE', 'www'); ``` #### 模板视图目录设置 设置模板目录常量,模板必须是APP_DIR目录下template文件夹的子目录。 ```php define('TEMPLATE', 'www'); ``` ### 全局常量设置 > 常量文件位置在APP_DIR/config/下面三个子目录test,production,development中的constans.php文件分别按环境设置。 #### 地址路由 地址路由配置,以/index.php?c=main&a=index为例子。
c代表控制器类名字,默认控制器为Main。
a代表action方法名称,默认action为index。
你可以自定义设置这些值。 ```php define('DEFAULT_CONTROLLER', 'main'); define('DEFAULT_ACTION', 'index'); define('CONTROLLER_KEY_NAME', 'c'); define('ACTION_KEY_NAME', 'a'); ``` #### 字符编码 输出字符编码设置,以便Output::view()和Output::json()输出 ```php define('CHARSET', 'utf-8'); ``` #### Cookie相关设置 ```php //有效域名 define('COOKIE_DOMAIN', 'test.com'); //是否https发送 define('COOKIE_SECURE', false); //有效路径 define('COOKIE_PATH', '/'); //http只读 define('COOKIE_HTTPONLY', false); //过期时间秒 define('COOKIE_EXPIRE', 0); ``` #### Session设置 ```php //自定义session cookie名 define('SESSION_COOKIE_NAME', 'SE'); //session保存时间,0为关闭浏览器即失效,秒为单位 define('SESSION_EXPIRE', 0); ``` #### 哈希验证配置 ```php //加密安全混淆值 define('ENCRYPTION_KEY', 'weryi9878sdfddtgtbsdfh'); //表单提交token session 名称 define('TOKEN_SESSION_NAME', '34efddddre'); //表单token字段名 define('TOKEN_INPUT_NAME', 'fh40dfk9dd8dkfje'); //token过期时间,秒为单位 define('TOKEN_EXPIRE', 3600); ``` #### 会话认证配置 ```php //认证方式,cookie,jwt,session define('AUTH_TYPE', 'session'); //加密密钥 define('AUTH_SECRET', 'dsd#@4ddz!ds'); //认证名称 define('AUTH_NAME', 'auth'); //jwt存活时间,秒为单位 define('AUTH_JWT_EXPIRE', 600); //jwt数据过载方式,header或url define('AUTH_JWT_MODE', 'header'); //认证cookie存活时间 define('AUTH_COOKIE_EXPIRE', 0); ``` #### 多语言应用 ```php //默认语言环境 define('LANG', 'zh_cn'); ``` #### URL转换 URL重写转换输出模版,和路由无关,以配合Helper::url()使用 ```php //url 重写 define('URL', ['mod_name'=>['controller_name/action_name'=>'/{controller_key}/{action_key}']]); ``` 例子: ```php //注意Helper::url()参数和数组key的顺序 define('URL', [ 'www' => [ //www表示模块名称 'main/index' => '/', //echo $this->helper->url(['c'=>'main','a'=>'index']) //输出 / 'main/lists/type' => '/list/{type}.html', //echo $this->helper->url(['c'=>'main','a'=>'lists','type'=>'2']) //输出 /list/2.html 'main/lists/type/page' => '/list/{type}_{page}.html' //echo $this->helper->url(['c'=>'main','a'=>'lists','type'=>'2','page'=>'34']) //输出 /list/2_34.html ] ]); ``` #### 运行分析日志文件配置 ```php //分析器日志文件 define('PROFILER_LOG_FILE', APP_DIR . 'log/profiler.log'); ``` #### 中间件配置 ```php define('MIDDLEWARE', [ //controller运行之前 'before' => [ 'auth' => \middleware\Auth::class, 'authorize' => \middleware\Authorize::class ], //controller运行之后 'after' => [] ]); ``` ### 数据库配置 > 数据库文件位置在APP_DIR/config/下面三个子目录test,production,development中的database.php文件分别按环境设置。
> 暂时只支持mysqli default为默认数据库,可以直接Db::instance()访问默认数据库
Db::instance('read)访问read数据库 ```php //例子 return [ //默认数据库 'default' => [ 'driver' => 'mysqli', 'host' => 'set.database.to.hosts.file', 'username' => 'root', 'password' => '123456', 'database' => 'dataname', 'port' => 3306, 'charset' => 'utf8' ], //读数据库 'read'=> [ 'driver' => 'mysqli', 'host' => 'set.database.to.hosts.file', 'username' => 'root', 'password' => '123456', 'database' => 'dataname', 'port' => 3306, 'charset' => 'utf8' ] ]; ``` ### 全局变量数组 全局变量数组$var[] ```php //默认已包含$vars['controller']当前控制器值 //默认已包含$vars['action']当前action值 global $vars; ``` ### 数据库基本操作 > 暂时只支持mysqli
> default为默认数据库,可以直接Db::instance()访问默认数据库
> Db::instance('read)访问read数据库 #### query($sql) 方法 原始SQL语句执行,如是select返回数据集,delete,insert,update返回布尔值。 ```php use system/Database as Db; $db=Db::instance(); //返回一个结果集对象句柄 $result=$db->query('select * from table1 where f=2;'); //返回数据的条数,int类型 $result->num_rows; //返回结果集其中一条数据,默认第一条以对象形式返回字段 $result->row(); //以数组形式返回第3条数据 //$row['f']; $row=$result->row(2,'array'); //以对象形式返回第4条数据 //$row->f; $row=$result->row(3,'object') //返回数据集,默认对象形式 $recordset=$result->result(); foreach($recordset as $rs){ echo $rs->f; } //数组形式返回数据集 $recordset=$result->result('array'); foreach($recordset as $rs){ echo $rs['f']; } ``` #### select($table,$condition=[]) 方法 查询数据库表返回数据集对象。 > 参数说明 >> $table 数据表名称
>> $condition 查询条件数组,如果为空返回全部 ```php //查询条件 $condition= [ 'where' => ['f1'=>'2','f3>'=>'3','f4!='=>'8'], //where条件,支持运算符>,<,<>,!=,=,in,like,>=,<= 'fields' => ['f1','f2','f3'],//返回字段 'orderby' => ['f1'=>'desc','f2'=>'asc'], //排序 'limit' => [0,20] //返回数据条数 ,也可以是一个int值,如:limit=>10 ]; //返回数据句对象 $recordset=$db->select('table1',$condition); foreach($recordset->result() as $rs){ echo $rs->f1; } ``` #### insert($table,$data) 方法 插入数据到数据库表,返回布尔值。 >参数说明 >> $table 数据表名称
>> $data 插入表的数据数组 ```php //需要插入的数据 $data=['f1'=>'1','f2'=>'2']; $rs=$db->insert('table1',$data); if($rs){ //插入成功,返回最后一条插入语句产生的自增ID $this->db->insert_id; } ``` #### delete($table,$where=[]) 方法 删除数据集,返回布尔值 > 参数说明 >> $table 数据表名称
>> $where where条件数组,为空删除全部,谨慎使用! ```php //删除条件 $data=['f1'=>'1','f2'=>'2']; $rs=$db->delete('table1',$data); if($rs){ //删除成功,返回影响数据行数 $this->db->affected_rows; } ``` #### escape($str) 方法 SQL语句中的特殊字符进行转义,返回转义后字符串。 ```php //参见 http://php.net/manual/zh/mysqli.real-escape-string.php $db->escape('str'); ``` #### replace($table,$data) 方法 数据集主键如果存在就替换不然插入新数据,返回布尔值。 > 参数说明 >> $table 数据表名称
>> $data 需要操作的数据数组 ```php //需要插入或替换的数据,如果主键primary=1已存在,即替换本条数据,不然插入新数据。 $data=['primary'=>1,'f1'=>'1','f2'=>'2']; $rs=$db->replace('table1',$data); ``` #### update($table,$data,$where=[]) 方法 更新数据,返回布尔值或影响行数。 >参数说明 >> $table 数据表名称
>> $data 需要更新的数据数组
>> $where where条件,为空更新全部 ```php $data=['f1'=>'3','f3'=>'1']; $where=['id'=>2]; $rs=$db->update('table1',$data,$where); if($rs){ //更新成功,返回影响数据行数 $this->db->affected_rows; } ``` #### close() 方法 关闭数据库链接,返回布尔值。
正常情况下,框架在执行完到最后自动关闭链接,也可以提前手动关闭。 ```php //关闭默认数据链接 $db->close(); ``` ### Model数据模型 > 每个model必须于数据库某个表对应。
通过继承\system\Model,我们可以使用框架自带的功能便捷操作数据。
例如我们创建APP_DIR/model/Tablemodel.php。 ```php //Tablemodel.php //命名空间 namespace model; //类必须继承系统\system\Model类 class Tablemodel extends \system\Model { //构造函数必须有 public function __construct() { //必须设置一个数据表 $this->table = 'test'; //必须设置一个主键 $this->primary = 'id'; //设置一个表的结构,以便验证过滤 $this->schema = [ 'id' => [ 'rules' => 'num', 'label' => 'ID', 'default' => null, 'required' => false ], 'name' => [ 'validate' => ''required|string|filter:html', 'label' => '名称', 'default' => '', 'required' => true ]]; } } ``` ```php use model\Tablemodel; //我们可以这样调用model $model=new Tablemodel(); $model->one(1); ``` #### $this->RDB 属性 设置读数据库,默认为default数据库 ```php $this->RDB='read_database'; ``` #### $this->WDB 属性 设置写数据库,默认为default数据库 ```php $this->WDB='write_database'; ``` #### $this->table 属性 设置model对应数据表 ```php $this->table='table1'; ``` #### $this->primary 属性 设置数据表主键字段 ```php $this->primary='id'; ``` #### $this->schema 属性 设置数据表结构,以便验证过滤,数组key必须和字段名一致 > validate['regex'] 正则验证字段数据合法性 > validate['message'] 提示信息 > filter 过滤数据,blank|tag|entity 三个值组合使用, >> blank把连续多个空白字符转换成一个,
>> tag过滤html标签,
>> entity把html标签转换成实体字符。 > literal 字段的字面名字 > default 字段默认值 > required 是否必须填写字段 ```php $this->schema = [ 'id' => [ 'validate' => ['regex' => '/^\d+$/', 'message' => 'ID 不能为空'], 'literal' => 'ID', 'default' => null, 'required' => false ], 'name' => [ 'validate' => ['regex' => '/^\S+$/', 'message' => '名称不能为空'], 'filter'=>'blank|tag|entity' 'literal' => '名称', 'default' => '', 'required' => true ] ]; ``` #### $this->all($fields) 方法 获取数据表全部数据集,大表谨慎使用。 ```php $recordset=$this->all(['fname1','fname2']); //注意直接返回数据集,而不是result对象 foreach($recordset as $rs){ echo $rs->fname1; } ``` #### $this->count($where=[]) 方法 获取数据表数据条数,适合myisam表。 ```php //带条件的计算 $this->count(['field'=>'val']); //获取表总条数 $this->count(); ``` #### $this->delete($where=[]) 方法 删除表数据,成功返回true不然返回false。 ```php $rs=$this->delete(['f1'=>'2']); if($rs){ //删除成功返回true echo $rs; } ``` #### $this->insert($data=[]) 方法 插入数据,返回布尔值。 ```php $data=['f1'=>'1','f1'=>'2']; $rs=$this->insert($data); if($rs){ //插入成功 } ``` #### $this->lastid() 方法 获取最后插入的自增主键ID。 ```php $data=['f1'=>'1','f1'=>'2']; $rs=$this->insert($data); if($rs){ //获取最后插入自增主键 echo $this->lastid(); } ``` #### $this->one($id) 方法 通过主键数字ID或唯一字段获取一条记录。 ```php //如果是主键数字id $this->one(12); //如果是唯一字段 $this->one(['uniqname'=>'abc']); ``` #### $this->query($sql) 方法 执行通用SQL语句,
如果是select返回基础数据库result对象,
执行update,insert,delete返回布尔值。 ```php $result=$this->query('select * from table1'); ``` #### $this->select($condition=[]) 方法 按条件获取表数据对象集,参数为空,返回全部数据。 ```php $condition=[ 'where' => ['f1'=>'2'], 'fields' => ['f1','f2'], 'orderby' => ['f1'=>'desc','f2'=>'asc'], 'limit' => [0,20] //或 'limit'=>20 ]; $this->select($condition); ``` #### $this->update($data,$where=[]) 方法 更新数据记录,成功返回true,失败返回false ```php $data=['f1'=>2,'f2'=>3]; $where=['id'=>12]; $rs=$this->update($data,$where); if($rs){ //修改成功,返回影响true echo $rs; } ``` #### $this->where($where,$fields=[]) 方法 按条件返回数据对象集,主要为了简化$this->select() ```php $where=['f1'=>'2']; $fields=['f1','f2']; $this->where($where,$fields); ``` #### $this->safe 属性 验证过滤入库字段数据,返回system/Safe实例。 > 具体参见 文档Model数据验证部分 ```php //可以在控制器这样调用 $this->model('Tablemodel')->safe->clear($data); ``` ### Model数据验证 > Model数据验证,为了用户输入数据的合法性,
> 提供了几个实用方法函数以配合Model的$this->schema属性使用。 #### $this->safe->illegalFields 属性 > 接受返回验证不通过非法字段名数组 #### $this->safe->notMemberFields 属性 > 接受返回不在表字段中的非法字段名数组 #### $this->safe->incompleteFields 属性 > 接受返回未完成及必须填写的字段名数组 #### $this->safe->clear($data) 方法 清理不存在于schema里面的字段,
不是成员的字段保存于$this->notMemberFields
返回清理后的数据 ```php //清理之前的数据 $beforedata=[ //假如nomember不存在于$this->schema中,将被清理掉 'notmember'=>'val', //假如f1字段名存在于$this->schema 'f1'=>'val' ]; //清理之后 $afterdata=$this->safe->clear($data); //输出['f1'=>'val'] var_dump($afterdata); //输出不是成员字段名['notmember'] var_dump($this->notMemberFields); ``` #### $this->safe->complete($data) 方法 验证是否缺少必要字段,
缺少的必要字段保存于$this->incompleteFields
返回布尔值 ```php //假如$this->schema包含字段f1,f2必须填写不能为空 //注意$data没有包含字段f2 $data=['f1'=>'val']; //验证完整性 $result=$this->safe->complete($data); if($result){ //通过完整性验证 }else{ //没有通过验证 var_dump($this->incompleteFields); //输出['f2'] } ``` #### $this->safe->merge($data) 方法 与schema默认数据覆盖合并,并且清理不存在于schema里面的字段,
不是成员的字段保存于$this->notMemberFields
返回合并及清理的数据 ```php //假如$this->schema中存在f1字段,默认值等于val1 //注意f1现在的值为val2 $data=['f1'=>'val2','notmember'=>'valxx']; //合并覆盖数据并清理非成员字段 $result=$this->safe->merge($data); //输出['f1'=>'val2'] var_dump($result); //输出不是成员字段名['notmember'] var_dump($this->notMemberFields); ``` #### $this->safe->validate($data) 方法 验证数据合法性,非法字段保存于$this->illegalFields
返回布尔值 ```php //假如$this->schema中字段f1必须为int类型 //注意f1是字符串 $data=['f1'=>'val']; //验证合法性 $result=$this->safe->validate($data); if($result){ //通过合法性验证 }else{ //没有通过验证 var_dump($this->illegalFields); //输出['f1'] } ``` ### Controller控制器 #### 创建一个控制器 > 控制器文件必须放置在APP_DIR/module/module_name目录下,文件名必须和类名一致。 > 必须继承system/Controller。 创建一个控制器,以APP_DIR/module/www/Testcontroller.php为例。 ```php //命名空间 namespace module\www; //Testcontroller继承自定的inherit/Controller或system/Controller class Testcontroller extends \inherit\Controller { public function index() { $data['hello_world']='hello wolrd'; //调用一个model $this->model('Testmodel')->select(); //获取表单全部字段数据 $postdata=$this->input->post(); //清理不是schema成员字段 $afterdata=$this->model('Testmodel')->safe->clear($data); //插入表单提交的数据到数据库 $this->model('Testmodel')->insert($afterdata); //视图输出 $this->output->view('main',$data); } } ``` ### View视图 > 视图模板文件必须放置APP_DIR/template/module_name/目录下面 > 模板文件都是标准的原生php与htm混合代码,框架没有专门的模板功能 #### 创建视图模板 例如我们创建一个APP_DIR/template/www/test.php,www为module模块名。 ```php <?php echo $title; ?>

``` 我们可以在控制器里调用模板。
比如下面代码: ```php //模板变量 $data=['title'=>'网页标题','heading'=>'小标题','content'=>'内容']; //只需要填写文件名,支持子目录 $this->output->view('test',$data); ``` ### Helper帮助函数 > 自定义帮助函数文件必须放置APP_DIR/helper/目录下面 > 必须以类的形式组织功能函数 #### 自定义helper函数方法 例如我们创建APP_DIR/helper/Testhelper.php ```php //命名空间 namespace helper; //我可以继承\system\System,以便使用框架内建属性和函数方法,如果不需要可以忽略 class Testhelper extends \system\System { public function returntex($param){ //只有继承\system\System才能调用此方法 $this->input->get('str'); return $param; } } //我们可以在控制器,视图,model里面这样调用 //$this->helper->testhelper->returntex('str'); ``` #### $this->helper->url($param=[],$path=ENTRY,$anchor='') 方法 > 此方法框架自带 >参数说明 >>param 查询字符串数组
>>path 入口文件路径,默认值 ENTRY常量值
>>anchor 锚点 配合常量URL使用,返回被匹配的URL地址字符串 ```php //注意$this->helper->url()参数和数组key的顺序 define('URL', [ 'www' => [ //www表示模块名称 'main/index' => '/', //echo $this->helper->url(['c'=>'main','a'=>'index']) //输出 / 'main/lists/type' => '/list/{type}.html', //echo $this->helper->url(['c'=>'main','a'=>'lists','type'=>'2']) //输出 /list/2.html 'main/lists/type/page' => '/list/{type}_{page}.html' //echo $this->helper->url(['c'=>'main','a'=>'lists','type'=>'2','page'=>'34']) //输出 /list/2_34.html ] ]); ``` 不匹配URL常量返回 ```php //假如入口文件为index.php $this->helper->url(); //输出 /index.php?c=main&a=index $this->helper->url(['p1'=>'1','p2'=>2]); //输出 /index.php?c=main&a=index&p1=1&p2=2 //注意a参数和/mod/list.php以及anchor $this->helper->url(['a'=>'lists','p1'=>'1','p2'=>2],'/mod/list.php','anchor'); //输出 /mod/list.php?c=main&a=lists&p1=1&p2=2#anchor ``` #### $this->helper->pager($size, $total, $page, $url, $visible = 5) 方法 框架自带分页方法 ```php //每个页面10条数据 $size=10; //数据总数 $total=100; //当前页码 $page=$this->input->get('page',1); //地址模板 $url='/index/list/<%page%>.html'; //显示多少个页码链接 $visible=5; //调用pager $pager=$this->helper->pager($size, $total, $page, $url, $visible); echo $pager; //输出HTML // //
//1 //2 //3 //4 //5 //... //10 // //共 100 条记录 //
``` ### Input输入 #### $this->input->get() 方法 获取地址查询字符串值,不填参数返回全部数据数组 ```php //如果var_name为null,就返回默认值default_str $this->input->get('var_name','default_str'); //返回全部数据 $this->input->get(); ``` #### $this->input->post() 方法 获取表单数据,没有参数返回全部表单字段数组 ```php //字段不存在返回null $this->input->post('field_name'); //返回全部 $this->input->post(); ``` #### $this->input->ip() 方法 获取v4 IP地址 ```php //如果没有获取成功返回0.0.0.0 $this->input->ip(); ``` #### $this->input->isAjax() 方法 判断是否ajax请求,前端必须带HTTP_X_REQUESTED_WITH请求头部
返回布尔值 ```php //$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' $this->input->isAjax(); ``` #### $this->input->body() 方法 获取原始请求数据,一般用于API接口 ```php $this->input->body(); ``` #### $this->input->referer() 方法 获取上一个来源地址url,以便重定向 ```php //如果没有为空 $prev_url=$this->input->referer(); //重定向 $this->output->redirect($prev_url); ``` #### $this->input->method() 方法 获取当前请求方法 ```php //返回 POST,GET,OPTION等 $this->input->method(); ``` ### Output输出 #### $this->output->compress($string) 方法 删除html多余空白字符
返回处理之后的字符串 ```php $string=' str
ste
'; $result=$this->output->compress($string); echo $result; //输出 str
ste
``` #### $this->output->error($name = 'general', $data =[]) 方法 > 错误页面模板必须放置在APP_DIR/error/目录下面 > 参数说明 >> $name模板文件名,默认模板 genrnal
>> $data变量数据数组,默认数组 $data=['heading' => 'Error Message', 'message' => 'An error occurred.'] 错误页面设置,自动echo内容 ```php //通用错误页面, $this->output->error(); //自定义错误页面,假如APP_DIR/error/404.php已存在 $this->output->error('404',['title'=>'Not Found']); ``` #### $this->output->json($status, $message, $data=[], $return=false) 方法 输出json格式数据 > 参数说明 >> $status 设置一个状态码
>> $message 设置一个状态消息字符串
>> $data 需要输出的数组数据,默认为空数组
>> $return 设置布尔值,是否返回内容自定义echo输出,默认自动echo内容
```php $this->output->json('1002','操作成功',['data'=>'val','data2'=>'val2']); //输出 {'status':'1002','message':'操作成功','data':{'data1':'val','data2':'val2'}} //有返回值的自定义输出 $result=$this->output->json('1002','操作成功',['data'=>'val','data2'=>'val2'],true); echo $result; ``` #### $this->output->redirect($uri, $http_response_code=302) 方法 请求重定向 > 参数说明 >> $uri 重定向地址
>> $http_response_code http头响应码,默认值为302 ```php //转到index.php,默认响应码302 $this->output->redirect('/index.php'); //重定向到404页面 $this->output->redirect('/notfound.php',404); ``` #### $this->output->status($http_status_code) 方法 设置响应头 ```php $this->output->status('404'); //如同 header('HTTP/1.1 404 Not Found',true) ``` #### $this->output->view($view, $data = [], $return = false, $compress = false) 方法 输出视图,自动echo输出。 > 参数说明 >> $view 视图模板文件名称
>> $data 视图变量数据数组
>> $return 是否返回内容自动输出,默认值false
>> $compress 是否压缩HTML,默认值false ```php //假如已存在APP_DIR/template/www/test.php //模板数据 $data['var1'=>'val','var2'=>'val']; //框架自动echo输出, $this->output->view('test',$data); //返回自定义echo输出,并压缩html $result=$this->output->view('test',$data,true,true); echo $result ``` ### Session会话 #### $this->session->delete($name) 方法 > 删除一个会话元素,可以同时删除多个,没有返回值。 ```php //设置一个session元素 $this->session->set('name','bob'); $this->session->set('name2','foo'); //删除, $this->session->delete('name'); //删除多个 $this->session->delete(['name','name2']); ``` #### $this->session->destroy() 方法 > 注销当前会话,返回布尔值。 #### $this->session->flash($name) 方法 > 取得某个会话字段的值之后删除此会话字段,字段不存在返回null。 #### $this->session->get($name) 方法 > 取得某个会话字段,字段不存在返回null。 #### $this->session->set($name,$value='') 方法 > 设置一个会话字段,永远返回true。 #### $this->session->regenerate() 方法 > 使用新生成的会话ID更新现有会话ID。 ### Cookie管理 #### $this->cookie->delete($name) 方法 删除一个或多个cookie,参数接受一个字符串或一个数组,返回布尔值。 ```php //删除某个cookie $this->cookie->delete('name'); //删除多个cookie $this->cookie->delete(['name1','name2','name3']); ``` #### $this->cookie->get($name) 方法 获取一个cookie值,如果$name不存在返回null。 #### $this->cookie->set($name, $value, $expire = COOKIE_EXPIRE, $path = COOKIE_PATH, $domain = COOKIE_DOMAIN, $secure = COOKIE_SECURE, $httponly = COOKIE_HTTPONLY) 方法 设置一个cookie,返回布尔值。 参数说明 >> $name cookie名字 >> $value cookie值 >> $expire 过期时间,如果设置0,关闭浏览器失效,默认值COOKIE_EXPIRE常量 >> $path 有效路径,默认值COOKIE_PATH常量 >> $domain 有效域名,默认值COOKIE_DOMAIN常量 >> $secure 是否https,默认值COOKIE_SECURE常量 >> $httponly 是否http只读,默认值COOKIE_HTTPONLY常量 #### $this->cookie->many($data, $expire = COOKIE_EXPIRE, $path = COOKIE_PATH, $domain = COOKIE_DOMAIN, $secure = COOKIE_SECURE, $httponly = COOKIE_HTTPONLY) 方法 设置多个cookie,返回bool值。 > 参数说明 >> $data是一个数组,例如$data=['name'=>'val','name2'>'val2'].
>> 其它参数参考 $this->cookie->set()方法 ### Lang多语言配置 > 语言包必须放置APP_DIR/language目录下面。 #### 怎么创建语言包 我们以en_us和zh_cn为例:
创建英文APP_DIR/language/en_us/test.php ```php 'test','good'=>'very good']; ``` 创建中文APP_DIR/language/zh_cn/test.php ```php '测试','good'=>'非常好']; ``` #### 调用语言包 ```php echo $this->lang('zh_cn')->test['good']; //输出 非常好 echo $this->lang('en_us')->test['good']; //输出 very good //如果设置了LANG常量为zh_cn,我们可以这样调用 echo $this->lang->test['good']; // 输出 非常好 ``` ### Redis缓存 > 必须安装redis扩展才能使用 #### 配置redis服务器 放置配置文件redis.php到APP_DIR/config/development(test 或 production)目录下。
文件代码内容: ```php [ 'host' => 'set.redis.to.hosts.file', 'port' => 6379, 'password' => '', 'database' => 0, 'timeout' => 30, 'serialization' => true //是否自动序列化 ], //队列服务器 'queue' => [ 'host' => 'set.redis.to.hosts.file', 'port' => 6379, 'password' => '', 'database' => 0, 'timeout' => 30, 'serialization' => true //是否自动序列化 ] ]; ``` #### 调用redis服务 所有方法函数和属性均继承原生redis模块 ```php //如果设置了default服务器,我们可以这样调用 $this->redis->get('key'); //调用一个自定义redis服务 $this->redis('queue')->get('key'); ``` ### Security安全 > 此类提供了一些常用的安全方法函数 #### $this->security->blank($str) 方法 把多个空白字符转换成一个空白字符,已被model验证引用。 ```php $str=' dd dd d '; echo $this->security->blank($str); // 输出 ' dd dd d ' ``` #### $this->security->entity($str) 方法 把html标签转换成实体字符,已被model验证引用。 > 如同php内建函数 htmlspecialchars($str, ENT_QUOTES | ENT_HTML401, CHARSET); #### $this->security->tag($str) 方法 清理html标签,已被model验证引用。 > 如同php内建函数strip_tags($str) #### $this->security->token() 方法 生成一个表单token值,返回字符串。 ```html ``` #### $this->security->tokenName() 方法 生成一个表单token名字,返回字符串。 ```html ``` #### $this->security->checkToken() 方法 验证一个被提交上来的token是否有效,返回布尔值。 ```php if($this->security->checkToken()){ //token 有效 } ``` ### Upload上传文件 #### 类方法及属性说明 ```php //设置保存目录 $upload->dir='/www/upload'; //设置被允许的文件类型数组 $upload->extension=['jpg','gif']; //设置接受表单数据字段 $upload->data=$_FILES['filedata']; //自定文件名,如果不填写,将自动设置。 $upload->filename='filename'; //设置上传文件夹权限码,默认0777 $upload->mode='0777'; //必要属性设置完毕,执行上传处理,返回布尔值。 $upload->execute(); //执行完结果返回状态码 $upload->code; // 详细请查看 $upload::ERROR_MSG //执行完结果返回消息提示 $upload->message; // 详细请查看 $upload::ERROR_MSG ``` #### 代码例子 ```php //实例上传类 $upload = new \system\library\Upload(); //设置被允许的文件扩展 $upload->extension = ['jpg', 'gif', 'png', 'jpge']; //设置上传保存目录 $upload->dir = $_SERVER['DOCUMENT_ROOT'] . '/upload/' .date('y/nd/'); //接受表单数据字段 $upload->data = $_FILES['filedata']; //自定义生成一个文件名 $upload->filename = uniqid(); //执行上传操作 if ($upload->execute()) { echo $upload->code; // 输出 '0' echo $upload->message; //输出 '上传成功' echo $upload->filename; //输出完成的文件名+最终扩展名 return; } ``` ### Html标签生成 生成html标签 #### 简单代码例子 ```php //参数数组 $param=[ [ //标签名p 'name'='p', //标签的属性 'properties'=>['name'=>'ptag'], //子标签元素 'elements'=>[ [ 'name'='i', 'properties'=>['name'=>'itag'] ] ], [ //标签div 'name'='div', //标签属性 'properties'=>['name'=>'pdiv'], ] ]; //创建类实例 $html= new \System\Library\Html(); //生成标签 echo $html->tags($param); //输出 //

// //

//
``` ### Grid表格生成 待优化 #### $grid->fields #### $grid->setField() #### $grid->filters #### $grid->filters() #### $grid->setFilter() #### $this->tools #### $this->tools() #### $grid->setTool() #### $grid->table() ### Image图片修饰 对图片进行加水印和缩放操作 #### 简单代码例子 ```php //创建实例 $image= new \System\Library\Image(); //设置图片宽度 $image->width=300; //设置图片高度 $image->height=300; //源文件路径 $image->source='G:\fw.png'; //处理之后保存路径 $image->save='G:\fw300.png'; //水印字体大小 $image->fontsize=20; //字体文件路径 $image->font=APP_DIR.'font/1.ttf'; //图片质量 $image->quality=90; //文本水印 $image->text='text'; //是否开启水印功能,默认false $image->watermark=true; //水印文件地址,图片优先 $image->markimg='G:\water.png'; //处理图片,返回布尔值 if($image->resize()){ //处理结果状态码 $image->code; //处理结果返回信息 $image->message; } //具体状态码和状态信息请查看 $image::MAG 常量 ``` ### Smtp发送邮件 SMTP邮件发送, 支持发送纯文本邮件和HTML格式的邮件 #### 代码例子 ```php //设置smtp服务器 $mail = new \system\library\Smtp([ 'server'=>'smtp.qq.com', 'username' => "name", 'password' => "123456", 'port' => 25 ]); //设置发件人 $mail->from("XXXXX"); //设置发件人名字 $mail->fromname("XXXXX"); //设置收件人,多个收件人,调用多次 $mail->to("XXXXX"); //设置抄送,多个抄送,调用多次 $mail->cc("XXXX"); //设置秘密抄送,多个秘密抄送,调用多次 $mail->bcc("XXXXX"); //设置邮件主题 $mail->subject("test"); //设置邮件内容 $mail->body("test"); //发送邮件,返回布尔值 if($mail->send()){ //发送成功 }else{ //发送失败,返回错误信息 $mail->error(); } ``` ### Captcha验证码生成 #### $captcha->bgcolor 属性 设置验证码背景16进制颜色 ```php $captcha->bgcolor='#333333'; ``` #### $captcha->showBorder 属性 设置是否显示边框,布尔值 ```php $captcha->showBorder=true; ``` #### $captcha->borderColor 属性 设置验证码边框16进制颜色 ```php $captcha->borderColor='#cccccc'; ``` #### $captcha->charLen 属性 设置验证码的位数 ```php $captcha->charLen=4; ``` #### $captcha->fontPath 属性 设置字体放置目录,绝对路径,默认目录APP_DIR/font/ ```php $captcha->fontPath=APP_DIR.'/font/'; ``` #### $captcha->width 属性 设置图片宽度,单位像素 #### $captcha->height 属性 设置图片高度,单位像素 #### $captcha->getCode() 方法 获取生成的文字,以便保存到session #### $captcha->create() 方法 生成渲染图像 #### $captcha->show() 方法 发送显示到浏览器 #### 简单代码例子 ```php //假如地址 index.php?c=captcha&a=showimg $authcode = new \system\library\Captcha(); $authcode->create(); $this->session->set('authcode', $authcode->getCode()); $authcode->show(); //html img标签显示 ```