Skip to content

ENPHP非常适合中小型web应用的开发设计,内置数据验证,多数据库分离,Redis,数据缓存,会话认证,中间件等支持及常用的库函数。 以优化80%重复功能为目标设计的全栈框架。

License

beyondye/ENPHP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

ENPHP Framework是一个轻量级的,开包即用的PHP开源框架

ENPHP非常适合中小型web应用的开发设计,内置数据验证,多数据库分离,Redis,数据缓存,会话认证,中间件等支持及常用的库函数。 以优化80%重复功能为目标设计的全栈框架。

版本库依赖

PHP7+
mb_string扩展

文档目录索引

常量配置

入口文件配置 常量设置 数据库配置 全局变量数组

框架基本使用

Controller控制器 View视图 Model数据模型

框架核心组建

Input输入 Output输出 Session会话 Cookie管理

数据库操作

数据库基本操作 Model数据对象 Model数据验证

缓存

Redis缓存 Cache缓存

安全认证

Authorize认证 Security安全 Captcha验证码生成

库函数

Upload上传文件 Html标签生成 Grid表格生成
Image图片修饰 Smtp发送邮件 Captcha验证码生成

文档内容

入口文件配置

入口文件一般是网站的根目录index.php文件,有几个重要的常量配置。

运行环境设置

设置运行环境变量,三个值分别为测试环境,产品环境,开发环境。

// test,production,development
define('ENVIRONMENT', 'development');

应用目录设置

define('APP_DIR', realpath('app_dir') . DIRECTORY_SEPARATOR);

框架目录设置

define('SYS_DIR', realpath('system_dir') . DIRECTORY_SEPARATOR);

控制器模块目录设置

设置controller模块目录常量,模块必须是APP_DIR目录下module文件夹的子目录。

define('MODULE', 'www');

模板视图目录设置

设置模板目录常量,模板必须是APP_DIR目录下template文件夹的子目录。

define('TEMPLATE', 'www');

全局常量设置

常量文件位置在APP_DIR/config/下面三个子目录test,production,development中的constans.php文件分别按环境设置。

地址路由

地址路由配置,以/index.php?c=main&a=index为例子。
c代表控制器类名字,默认控制器为Main。
a代表action方法名称,默认action为index。
你可以自定义设置这些值。

define('DEFAULT_CONTROLLER', 'main');
define('DEFAULT_ACTION', 'index');
define('CONTROLLER_KEY_NAME', 'c');
define('ACTION_KEY_NAME', 'a');

字符编码

输出字符编码设置,以便Output::view()和Output::json()输出

define('CHARSET', 'utf-8');

Cookie相关设置

//有效域名
define('COOKIE_DOMAIN', 'test.com'); 

//是否https发送
define('COOKIE_SECURE', false);

//有效路径
define('COOKIE_PATH', '/');

//http只读
define('COOKIE_HTTPONLY', false);

//过期时间秒
define('COOKIE_EXPIRE', 0);

Session设置

//自定义session cookie名
define('SESSION_COOKIE_NAME', 'SE');

//session保存时间,0为关闭浏览器即失效,秒为单位
define('SESSION_EXPIRE', 0);

哈希验证配置

//加密安全混淆值
define('ENCRYPTION_KEY', 'weryi9878sdfddtgtbsdfh');

//表单提交token session 名称
define('TOKEN_SESSION_NAME', '34efddddre');

//表单token字段名
define('TOKEN_INPUT_NAME', 'fh40dfk9dd8dkfje');

//token过期时间,秒为单位
define('TOKEN_EXPIRE', 3600);

会话认证配置

//认证方式,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);

多语言应用

//默认语言环境
define('LANG', 'zh_cn');

URL转换

URL重写转换输出模版,和路由无关,以配合Helper::url()使用

//url 重写
define('URL', ['mod_name'=>['controller_name/action_name'=>'/{controller_key}/{action_key}']]);

例子:

//注意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
                 
    ]
]);

运行分析日志文件配置

//分析器日志文件
define('PROFILER_LOG_FILE', APP_DIR . 'log/profiler.log');

中间件配置

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数据库

//例子

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[]

//默认已包含$vars['controller']当前控制器值
//默认已包含$vars['action']当前action值
global $vars;

数据库基本操作

暂时只支持mysqli
default为默认数据库,可以直接Db::instance()访问默认数据库
Db::instance('read)访问read数据库

query($sql) 方法

原始SQL语句执行,如是select返回数据集,delete,insert,update返回布尔值。

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 查询条件数组,如果为空返回全部

//查询条件
$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 插入表的数据数组

//需要插入的数据
$data=['f1'=>'1','f2'=>'2'];

$rs=$db->insert('table1',$data);
if($rs){
   //插入成功,返回最后一条插入语句产生的自增ID
   $this->db->insert_id;
}

delete($table,$where=[]) 方法

删除数据集,返回布尔值

参数说明

$table 数据表名称
$where where条件数组,为空删除全部,谨慎使用!

//删除条件
$data=['f1'=>'1','f2'=>'2'];

$rs=$db->delete('table1',$data);
if($rs){
   //删除成功,返回影响数据行数
   $this->db->affected_rows;
}

escape($str) 方法

SQL语句中的特殊字符进行转义,返回转义后字符串。

//参见 http://php.net/manual/zh/mysqli.real-escape-string.php
$db->escape('str');

replace($table,$data) 方法

数据集主键如果存在就替换不然插入新数据,返回布尔值。

参数说明

$table 数据表名称
$data 需要操作的数据数组

//需要插入或替换的数据,如果主键primary=1已存在,即替换本条数据,不然插入新数据。
$data=['primary'=>1,'f1'=>'1','f2'=>'2'];

$rs=$db->replace('table1',$data);

update($table,$data,$where=[]) 方法

更新数据,返回布尔值或影响行数。

参数说明

$table 数据表名称
$data 需要更新的数据数组
$where where条件,为空更新全部

$data=['f1'=>'3','f3'=>'1'];
$where=['id'=>2];

$rs=$db->update('table1',$data,$where);

if($rs){
   //更新成功,返回影响数据行数
   $this->db->affected_rows;
 
}

close() 方法

关闭数据库链接,返回布尔值。
正常情况下,框架在执行完到最后自动关闭链接,也可以提前手动关闭。

//关闭默认数据链接
$db->close();

Model数据模型

每个model必须于数据库某个表对应。

通过继承\system\Model,我们可以使用框架自带的功能便捷操作数据。
例如我们创建APP_DIR/model/Tablemodel.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
            ]];
    }

}
use model\Tablemodel;
 
//我们可以这样调用model
$model=new Tablemodel();
$model->one(1);

$this->RDB 属性

设置读数据库,默认为default数据库

$this->RDB='read_database';

$this->WDB 属性

设置写数据库,默认为default数据库

$this->WDB='write_database';

$this->table 属性

设置model对应数据表

$this->table='table1';

$this->primary 属性

设置数据表主键字段

$this->primary='id';

$this->schema 属性

设置数据表结构,以便验证过滤,数组key必须和字段名一致

validate['regex'] 正则验证字段数据合法性

validate['message'] 提示信息

filter 过滤数据,blank|tag|entity 三个值组合使用,

blank把连续多个空白字符转换成一个,
tag过滤html标签,
entity把html标签转换成实体字符。

literal 字段的字面名字

default 字段默认值

required 是否必须填写字段

      $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) 方法

获取数据表全部数据集,大表谨慎使用。

$recordset=$this->all(['fname1','fname2']);

//注意直接返回数据集,而不是result对象
foreach($recordset as $rs){
    echo $rs->fname1;
}

$this->count($where=[]) 方法

获取数据表数据条数,适合myisam表。

//带条件的计算
$this->count(['field'=>'val']);

//获取表总条数
$this->count();

$this->delete($where=[]) 方法

删除表数据,成功返回true不然返回false。

$rs=$this->delete(['f1'=>'2']);
if($rs){
    //删除成功返回true
    echo $rs;
}

$this->insert($data=[]) 方法

插入数据,返回布尔值。

$data=['f1'=>'1','f1'=>'2'];

$rs=$this->insert($data);

if($rs){
    //插入成功
}

$this->lastid() 方法

获取最后插入的自增主键ID。

$data=['f1'=>'1','f1'=>'2'];

$rs=$this->insert($data);

if($rs){
    //获取最后插入自增主键
    echo $this->lastid();
}

$this->one($id) 方法

通过主键数字ID或唯一字段获取一条记录。

//如果是主键数字id
$this->one(12);

//如果是唯一字段
$this->one(['uniqname'=>'abc']);

$this->query($sql) 方法

执行通用SQL语句,
如果是select返回基础数据库result对象,
执行update,insert,delete返回布尔值。

$result=$this->query('select * from table1');

$this->select($condition=[]) 方法

按条件获取表数据对象集,参数为空,返回全部数据。

$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

$data=['f1'=>2,'f2'=>3];
$where=['id'=>12];

$rs=$this->update($data,$where);

if($rs){
    //修改成功,返回影响true
    echo $rs;
}

$this->where($where,$fields=[]) 方法

按条件返回数据对象集,主要为了简化$this->select()

$where=['f1'=>'2'];
$fields=['f1','f2'];
$this->where($where,$fields);

$this->safe 属性

验证过滤入库字段数据,返回system/Safe实例。

具体参见 文档Model数据验证部分

//可以在控制器这样调用
$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
返回清理后的数据

//清理之前的数据
$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
返回布尔值

//假如$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
返回合并及清理的数据

//假如$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
返回布尔值

//假如$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为例。

//命名空间
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模块名。

<html>
    <head><title><?php echo $title; ?></title></head>
    <body>
        <h1>
            <?php echo $heading; ?>
        </h1>
        <div><?php echo $content; ?></div>
    </body>
</html>

我们可以在控制器里调用模板。
比如下面代码:

//模板变量
$data=['title'=>'网页标题','heading'=>'小标题','content'=>'内容'];

//只需要填写文件名,支持子目录
$this->output->view('test'$data);

Helper帮助函数

自定义帮助函数文件必须放置APP_DIR/helper/目录下面

必须以类的形式组织功能函数

自定义helper函数方法

例如我们创建APP_DIR/helper/Testhelper.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地址字符串

//注意$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常量返回

//假如入口文件为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) 方法

框架自带分页方法

//每个页面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
//
//<div class="pager">
//<a class="number" href="/index/list/1.html">1</a>
//<a class="number " href="/index/list/2.html">2</a>
//<a class="number " href="/index/list/3.html">3</a>
//<a class="number " href="/index/list/4.html">4</a>
//<a class="number " href="/index/list/5.html">5</a>
//<span class="ellipsis">...</span>
//<a  class="number" href="/index/list/10">10</a>
//<a href="/index/list/2.html" class="next">下一页</a>
//<span class="info">共 100 条记录</span>
//</div>

Input输入

$this->input->get() 方法

获取地址查询字符串值,不填参数返回全部数据数组

//如果var_name为null,就返回默认值default_str
$this->input->get('var_name','default_str');

//返回全部数据
$this->input->get();

$this->input->post() 方法

获取表单数据,没有参数返回全部表单字段数组

//字段不存在返回null
$this->input->post('field_name');

//返回全部
$this->input->post();

$this->input->ip() 方法

获取v4 IP地址

//如果没有获取成功返回0.0.0.0
$this->input->ip();

$this->input->isAjax() 方法

判断是否ajax请求,前端必须带HTTP_X_REQUESTED_WITH请求头部
返回布尔值

//$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'
$this->input->isAjax();

$this->input->body() 方法

获取原始请求数据,一般用于API接口

$this->input->body();

$this->input->referer() 方法

获取上一个来源地址url,以便重定向

//如果没有为空
$prev_url=$this->input->referer();

//重定向
$this->output->redirect($prev_url);

$this->input->method() 方法

获取当前请求方法

//返回 POST,GET,OPTION等
$this->input->method();

Output输出

$this->output->compress($string) 方法

删除html多余空白字符
返回处理之后的字符串

$string='<b style=""    >  str </b><div>   ste  </div>';

$result=$this->output->compress($string);

echo $result;
//输出 <b style="">str</b><div>ste</div>

$this->output->error($name = 'general', $data =[]) 方法

错误页面模板必须放置在APP_DIR/error/目录下面

参数说明

$name模板文件名,默认模板 genrnal
$data变量数据数组,默认数组 $data=['heading' => 'Error Message', 'message' => 'An error occurred.']

错误页面设置,自动echo内容

//通用错误页面,
$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内容

$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

//转到index.php,默认响应码302
$this->output->redirect('/index.php');

//重定向到404页面
$this->output->redirect('/notfound.php',404);

$this->output->status($http_status_code) 方法

设置响应头

$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

//假如已存在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) 方法

删除一个会话元素,可以同时删除多个,没有返回值。

//设置一个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,参数接受一个字符串或一个数组,返回布尔值。

//删除某个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
return ['test'=>'test','good'=>'very good'];

创建中文APP_DIR/language/zh_cn/test.php

<?php
return ['test'=>'测试','good'=>'非常好'];

调用语言包

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
return [
    //默认
    'default' => [
        '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模块

//如果设置了default服务器,我们可以这样调用
$this->redis->get('key');

//调用一个自定义redis服务
$this->redis('queue')->get('key');

Security安全

此类提供了一些常用的安全方法函数

$this->security->blank($str) 方法

把多个空白字符转换成一个空白字符,已被model验证引用。

$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值,返回字符串。

<input name="_tokenname_" value="<?php echo $this->security->token() ?>" />

$this->security->tokenName() 方法

生成一个表单token名字,返回字符串。

<input name="<?php echo $this->security->tokenName() ?>" value="<?php echo $this->security->token() ?>" />

$this->security->checkToken() 方法

验证一个被提交上来的token是否有效,返回布尔值。

if($this->security->checkToken()){

    //token 有效

}

Upload上传文件

类方法及属性说明

//设置保存目录
$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

代码例子

//实例上传类
$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标签

简单代码例子

//参数数组
$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);
//输出 
//<p name="ptag">
//    <i name="itag"></i>
//</p>
//<div name="pdiv"></div>

Grid表格生成

待优化

$grid->fields

$grid->setField()

$grid->filters

$grid->filters()

$grid->setFilter()

$this->tools

$this->tools()

$grid->setTool()

$grid->table()

Image图片修饰

对图片进行加水印和缩放操作

简单代码例子

//创建实例
$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格式的邮件

代码例子

//设置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("<b>test</b>");

//发送邮件,返回布尔值
if($mail->send()){
    //发送成功
}else{
    //发送失败,返回错误信息
    $mail->error();
}

Captcha验证码生成

$captcha->bgcolor 属性

设置验证码背景16进制颜色

$captcha->bgcolor='#333333';

$captcha->showBorder 属性

设置是否显示边框,布尔值

$captcha->showBorder=true;

$captcha->borderColor 属性

设置验证码边框16进制颜色

$captcha->borderColor='#cccccc';

$captcha->charLen 属性

设置验证码的位数

$captcha->charLen=4;

$captcha->fontPath 属性

设置字体放置目录,绝对路径,默认目录APP_DIR/font/

$captcha->fontPath=APP_DIR.'/font/';

$captcha->width 属性

设置图片宽度,单位像素

$captcha->height 属性

设置图片高度,单位像素

$captcha->getCode() 方法

获取生成的文字,以便保存到session

$captcha->create() 方法

生成渲染图像

$captcha->show() 方法

发送显示到浏览器

简单代码例子

//假如地址 index.php?c=captcha&a=showimg

$authcode = new \system\library\Captcha();
$authcode->create();
$this->session->set('authcode', $authcode->getCode());
$authcode->show();

//html img标签显示 <img src="index.php?c=captcha&a=showimg" />

About

ENPHP非常适合中小型web应用的开发设计,内置数据验证,多数据库分离,Redis,数据缓存,会话认证,中间件等支持及常用的库函数。 以优化80%重复功能为目标设计的全栈框架。

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages