ThinkPHP入口文件
// 应用入口文件
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
// 定义应用目录
define('APP_PATH','./Weibo/');
//设定目录生成的文件
define('DIR_SECURE_FILENAME' , 'default.html' );
//设置目录页面内容
define('DIR_SECURE_CONTENT' , ' 目录禁止' );
//禁止目录主页生成
define('BUILD_DIR_SECURE' , false);
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
// 亲^_^ 后面不需要任何代码了 就是如此简单
建立控制器
控制器类的命名方式:控制器名(驼峰式,首字母大写) +Controller
控制器文件的命名方式:类名+class.php
创建一个控制器需要三个部分: 1.设置命名空间; 2.导入命名空间; 3.控制器类
<?php
namespace Home\Controller; //设置命名空间,就是当前目录
use Think\Controller; //继承父类用到Controller类
class UserController extends Controller
{
public function test()
{
echo "usercontroller";
}
}
访问的URL为:http://localhost/tp3_2/index.php/Home/User/test
有时方法名可能和关键字冲突, 那么定义起来就比较麻烦, 控制器提供了一个配置定义:
//配置控制器方法后缀
'ACTION_SUFFIX' =>'Action',
//每个方法后面加上Action,对于URL访问不需要加Action
public function listAction(){
echo 'list';
}
默认情况下, 控制器只支持一级控制器。 当项目较为繁杂的时候, 想创建统一模块下多个控制器时,可以配置二级控制器。
第一步:配置允许二级控制器;
//允许二级控制器
'CONTROLLER_LEVEL' =>2,
第二步:在 Controller 目录下创建 User 目录,在 User 目录下创建一个控制器;
//二级控制器写法
namespace Home\Controller\User;
use Think\Controller;
class MemberController extends Controller {
public function index() {
echo ' 多级控制器' ;
}
}
Action 参数绑定
参数绑定是通过直接绑定 URL 地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析。
//启用Action参数绑定,默认为true,可以不写
'URL_PARAMS_BIND' =>true,
默认的参数绑定是按变量名来绑定的,直接通过 URL 传递参数。
//变量名为$id
class UserController extends Controller {
public function index($id) {
echo 'id:' .$id;
}
}
URL: http://localhost/demo39/User/index/id/5
如果你个那个参数设定一个默认值,当没有传递参数的时候,会直接启用默认值:
//给变量$id 设置默认值
public function index($id=1)
还有一种是按顺序传递参数,这个方法可以省略掉键值对中的键,也就是说 id 不需要传递,只需要传递 5 这个值即可。但必须按照多个参数的顺序。
//定义按顺序传参绑定
'URL_PARAMS_BIND_TYPE' =>1,
//传递两个参数
class UserController extends Controller {
public function index($id, $type) {
echo 'id:' .$id. ',type:' .$type;
}
}
URL: http://localhost/demo39/User/index/5/a
模块化设计
<?php
return array(
//'配置项'=>'配置值'
//禁止访问模块
//'MODULE_DENY_LIST' => array('Common' , 'Runtime' ),
//禁止访问模块,添加一个Admin模块
//'MODULE_DENY_LIST' => array('Common', 'Runtime','Admin'),
//允许访问的模块,设置了,就必须写全,漏写的将无法访问
// 'MODULE_ALLOW_LIST' => array('Home' , 'Admin' ),
//设置默认起始模块
// 'DEFAULT_MODULE' => 'Admin' ,
//单模块设置
'MULTI_MODULE' => false,
);
有时,你会觉得 index.php/Admin 这样很麻烦。你可能想直接 admin.php 就代表后台就方便很多,那么可以使用多入口设置。
这里的多入口和上一节多个应用项目不同, 而是通过 admin.php 访问 Weibo 目录下的Admin 模块。将 index.php 复制出来改成 admin.php,然后添加如下代码:
//默认指向Admin模块
$_GET['m' ] = 'Admin';
//默认指向Index控制器
$_GET['c' ] = 'Admin' ;
URL 模式
ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式、REWRITE和兼容模式。
http://localhost/demo39/index.php/模块/控制器/操作
PATHINFO 模式下默认的分隔符是/,我们可以设置为你想要的,比如: _
//设置键值对分隔符
'URL_PATHINFO_DEPR' =>'_' ,
设置了分隔符的 URL:
http://localhost/demo39/index.php/Home_User_test_user_Lee_pass_123
//REWRITE模式(重写模式)
httpd.conf 配置文件中加载了 mod_rewrite.so 模块
AllowOverride None 将 None 改为 All
把下面的内容保存为.htaccess 文件放到应用入口文件的同级目录下
这样, ThinkPHP 自带的.htaccess 文件就起作用了,可以过滤掉 index.php 这个字符串。
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
//去除了index.php
http://localhost/demo39/Home/User/test/user/Lee/pass/123
一. 创建数据库
//mysql全局定义
// 'DB_TYPE' =>'mysql' , //数据库类型
// 'DB_HOST' =>'localhost' , //服务器地址
// 'DB_NAME' =>'test' , //数据库名
// 'DB_USER' =>'root' , //用户名
// 'DB_PWD' =>'123456' , //密码
// 'DB_PORT' =>3306, //端口
// 'DB_PREFIX' =>'think_' , //数据库表前缀
//PDO专用定义
'DB_TYPE' =>'pdo' , //数据库类型
'DB_USER' =>'root' , //用户名
'DB_PWD' =>'123456' , //密码
'DB_PORT' =>3306, //端口
'DB_PREFIX' =>'think_' , //数据库表前缀
'DB_DSN'=>'mysql:host=localhost;dbname=test;charset=utf8'
二. 实例化模型
在ThinkPHP 中,提供了 Model 基类处理,也可以使用 M()方法。
Model 基类可以传递三个参数:
Model([' 模型名'],[' 数据表前缀'],[' 数据库连接信息']);
//实例化Model类,定义数据库链接信息
$user=new Model('User','think_','mysql://root:123456@localhost/thinkphp' );
使用 Model 基类还需要导入命名空间,而使用 M()方法,则不需要。
//实例化Model类
$user = M('User' );
除了使用 Model 基类和 M()方法, 还有一种对应数据表的模型定义, 比如: UserModel。这种模型类并非必须定义的,只有当存在独立的业务逻辑或者属性的时候才需要。
模型名 对应的数据表(假设前缀是 think_)
UserModel think_user
UserTypeModel think_user_type
//User模型类
namespace Home\Model;
use Think\Model;
class UserModel extends Model {}
创建了 UserModel 模型类后,控制器那头就可以直接声明。
//User模型类
$user = new UserModel();
var_dump($user->select());
//页面Trace,调试辅助工具
'SHOW_PAGE_TRACE' =>true,
//重新定义表前缀
class UserModel extends Model {
protected $tablePrefix = 'abc_' ;
}
//重新定义表名
class UserModel extends Model {
protected $tableName = 'abc' ;
}
//重新定义完整的带前缀的表名
class UserModel extends Model {
protected $trueTableName = 'tp_abc' ;
}
//附加数据库名
class UserModel extends Model {
protected $dbName = 'tp' ;
}
如果你仅仅使用 CURD 等数据库基本操作,我们建议使用基于 Model 基类的 M()方法。
使用 M()方法由于不需要加载具体的模型类(比如 UserModel 类),所以性能会更高。
当然,如果有必要使用具体的模型类时, ThinkPHP 还提供了 D()方法来直接是实例化模型类,并且还可以免去引入命名空间等操作。
//实例化UserModel类
$user = D('User' );
D()方法可以直接调用当前模块的模型类, 那么如果跨模块调用的话, 那怎么处理呢?
比如 Admin 后台模块,可以使用目录声明。
//跨模块实例化
$user = D('Admin/User' );
有时,你可能想使用原生的 SQL 语句进行操作数据库。那么可以采用实例化空模型基类或者空 M()方法。
//空 M()方法
$user = M(); //或者new Model(); 空基类
var_dump($user->query("SELECT * FROM think_user WHERE user=' 蜡笔小新'"));
三. 字段定义
// 关闭字段缓存
'DB_FIELDS_CACHE' =>false //开启了调试模式,自动关闭
PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除
/Data/_fields 文件夹,重新获取字段。
你也可以使用手动定义数据表字段的方式取代字段缓存方式,这种方式可以提高性能,避免 IO 开销。
//手动定义数据表字段, _pk表示主键
class UserModel extends Model {
protected $fields = array('id' , 'user' , '_pk' =>'id' );
}
//type 定义每个字段的类型,可以永远字段验证
class UserModel extends Model {
protected $fields = array('id' , 'user' , '_pk' =>'id' ,
'type' =>array('id' =>'smallint' , 'user' =>'varchar' ));
}
一. 查询方式
1. 使用字符串作为条件查询
//字符串作为条件查询
$user = M('User' );
var_dump($user->where('id=1 AND user="蜡笔小新"' )->select());
2. 使用索引数组作为查询条件
//索引数组作为条件查询
$user = M('User' );
$condition['id' ] = 1;
$condition['user' ] = ' 蜡笔小新' ;
var_dump($user->where($condition)->select());
PS: 索引数组查询的默认逻辑关系是 AND, 如果想改变为 OR, 可以使用_logic 定义查询逻辑。
基于上面的代码增加如下一行:
$condition['_logic' ] = 'OR' ; //将默认 AND 改成 OR
3. 使用对象方式来查询
//对象作为条件查询
$user = M('User' );
$condition = new \stdClass();
$condition->id = 1;
$condition->user = ' 蜡笔小新' ;
var_dump($user->where($condition)->select());
//最终生成的 SQL 语句
SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = ' 蜡笔小新' )
PS: stdClass 类是 PHP 内置的类, 可以理解为一个空类, 在这里可以理解为把条件的字段作为成员保存到 stdClass 类里。而这里的' \' 是将命名空间设置为根目录,否则会导致当前目录找不到此类。 使用对象和数组查询, 效果是一样的, 可以互换。 在大多数情况下,ThinkPHP 推荐使用数组形式更加高效。
二. 表达式查询
对于那些要实现模糊判断的查询, 比如大于、 等于、 小于之类的SQL查询, 可以使用表达式查询方式。
查询表达式格式: $map[' 字段名'] = array(' 表达式',' 查询条件');
三. 快捷查询
四. 区间查询
五. 组合查询
六. 统计查询
七. 动态查询
借助 PHP5 语言的特性, ThinkPHP 实现了动态查询。
1. getBy 动态查询
//查找[email protected]的数据
$user = M('User' );
var_dump($user->getByemail('[email protected]' ));
2. getFieldBy 动态查询
//通过user得到相对应id值
$user = M('User' );
var_dump($user->getFieldByUser(' 路飞' , 'id' ));
八. SQL 查询
ThinkPHP 支持原生 SQL 查询。
1. query 读取
//查询结果集,如果采用分布式读写分离,则始终在读服务器执行
$user = M('User' );
var_dump($user->query('SELECT * FROM think_user' ));
2.execute写入
//更新和写入,如果采用分布式读写分离,则始终在写服务器执行
$user = M('User' );
var_dump($user->execute('UPDATE think_user set user="蜡笔大新" WHEREid=1' ));
连贯方法…
CURD操作…
自动验证
一. 验证规则
数据验证可以对表单中的字段进行非法的验证操作。 一般提供了两种验证方式: 静态定义($_validate 属性)和动态验证(validate()方法)。
//验证规则
array(
array(验证字段1, 验证规则, 错误提示,[验证条件, 附加规则, 验证时间]),
array(验证字段2, 验证规则, 错误提示,[验证条件, 附加规则, 验证时间]),
......
);
PS:验证字段、验证规则和错误提示这三项是必选的,大多数也是用这三项;而验证条件、附加规则和验证时间是可选的。
验证规则: 系统内置了常用的规则, require(字段必填)、 email(邮箱格式)、 url(url格式)、 currency(货币)、 number(正整数)、 integer(整数)、 double(浮点数)、 zip(邮政编码)、 english(英文)。这些规则默认采用的附加规则是 regex,正则表达式验证,只不过是设定好的。
错误信息:验证失败后的提示。
验证条件:共三种:
1. self::EXISTS_VALIDATE 或 0,表示存在字段就验证(默认);
2. self::MUST_VALIDATE 或 1,表示必须验证;
3. self::VALUE_VALIDATE 或 2,表示值不为空的时候验证。
二. 静态定义
在模型类里预先定义好该模型的自动验证规则,就是静态定义。
//模型类定义验证规则
class UserModel extends Model {
protected $_validate = array(
//默认情况下用系统内置
array('user' , 'require' , ' 用户不得为空! ' ),
//验证数据唯一性
array('user' , '' , ' 用户名称已存在! ' ,2, 'unique' ,1),
//验证密码不得为空
array('pass' , 'require' , ' 密码不得为空! ' ),
//密码不得小于六位不得大于20位
array('pass' , '6,20' , ' 密码不得小于6位,不得大于20位' , 3,'length' ),
);
}
ThinkPHP 提供了九种自动验证内置方案,具体如下:
//内置验证require,不得为空的用法
array('user' , 'require' , ' 用户不得为空! ' ),
//内置验证email,合法的邮箱格式
array('user' , 'email' , ' 邮箱格式不合法! ' ),
//内置验证url,验证网址是否合法
array('user' , 'url' , 'URL 路径不合法! ' ),
//内置验证currency,验证是否为货币
array('user' , 'currency' , ' 货币格式不正确! ' ),
...
三. 动态验证
动态验证就是把验证的规则放在控制器端, 这样, 在操作的时候比较灵活, 缺点就是比较混乱。
//动态验证
$rule = array(
array('user' , 'require' , ' 用户名不得为空' ),
);
$user = M('User' );
$data['user' ] = '' ;
if ($user->validate($rule)->create($data)) {
echo ' 验证所有字段成功! ' ;
} else {
var_dump($user->geterror());
}
自动完成
一. 完成规则
自动完成一般通过默认字段写入、 安全字段过滤以及业务逻辑的自动处理等。 有两种方式实现自动完成的规则: 1. 静态方式:在模型类里通过$_auto 属性定义处理规则; 2 动态方式:使用模型类的 auto 方法动态创建自动处理规则。
//完成规则
array(
array(完成字段1, 完成规则,[完成条件, 附加规则]),
array(完成字段2, 完成规则,[完成条件, 附加规则]),
......
);
完成字段:必填,需要的字段名;
完成规则:必填,配合附加规则完成;
完成条件:可选,具体如下:
1. self::MODEL_INSERT 或 1,新增数据的时候处理(默认);
2. self::MODEL_UPDATE 或 2,更新数据的时候处理;
3. self::MODEL_BOTH 或 3,所有情况均处理。
二. 静态定义
在模型类里预先定义好该模型的自动完成规则,就是静态定义。
class UserModel extends Model {
//自动完成
protected $_auto = array(
//自动设置count字段为1
array('count' , ' 1' ),
//给密码加密,加密类型为sha1, sha1函数PHP内置
array('user' , 'sha1' , 3, 'function' ),
);
}
//把email字段的值填充到user字段冲去
array('user' , ' email' , 3, 'field' ),
//callback,给用户名加前缀
array('user' , 'updateUser' , 3, 'callback' , '_' ),
//回调函数
protected function updateUser($str, $prefix)
{
return $prefix.$str;
}
三. 动态完成
动态完成就是把完成的规则放在控制器端, 这样, 在操作的时候比较灵活, 缺点就是比较混乱。
//动态完成
$rules = array(
array('user' , 'sha1' , 3, 'function' ),
);
$user = M('User' );
$data['user' ] = ' 蜡笔小新' ;
if ($user->auto($rules)->create($data)) {
$user->add();
}
视图
一. 模版定义
模版在使用之前需要一定的设置, 才能方便开发者使用。 每个模块的模版文件是独立的,为了对模版文件更加有效的管理, ThinkPHP 对模版文件机型目录划分, 默认的模版文件定义规则是:视图目录/[模版主题/] 控制器名/操作名+模版后缀
第一步:在 User 控制器模块执行一条语句:
//渲染模版输出
$this->display();
默认情况下视图目录是 View,如果你想改变成别的目录名可以设置:
//修改模版的视图目录
'DEFAULT_V_LAYER' =>'Template' ,
默认情况下的模版文件后缀是.html,如果你想改变成别的后缀可以设置:
//修改模版中的文件的后缀
'TMPL_TEMPLATE_SUFFIX' =>'.tpl'
如果感觉每一个模块,都要创建相应的目录太过于麻烦,可以设置:
//用下划线代替目录层次
'TMPL_FILE_DEPR' =>'_' , //User_index.tpl
如果不想将模版存在在当前 Weibo 目录下,而设置在外部:
//设置外部的模版目录
'VIEW_PATH' =>'./Public/' ,
如果一个系统要考虑多套界面皮肤的话,要考虑到默认皮肤以及可选皮肤:
//设置默认主题目录
'DEFAULT_THEME' =>'default' ,
//切换主题
$this->theme('blue' )->display();
二. 赋值和渲染
如果要在模版中输出变量,必须在控制器中把变量传递给模版。 ThinkPHP 提供了assign 方法对模版变量赋值,无论何种变量类型都统一使用 assign 赋值。
//给模版传递一个变量
$this->assign('user' , ' 蜡笔小新' );
//模版中调用变量
{$user}
PS:这个方法必须在 display()方法之前使用,保存变量正确传递。
如果不传递任何参数,它会按照默认的目录定位模版的位置:
当前模块/默认视图目录/当前控制器/当前操作.html
//不传参数
$this->display();
./Weibo/Home/View/default/User/index.tpl
//修改默认模版
$this->display('add' );
./Weibo/Home/View/default/User/add.tpl
//修改默认模版,目录加模版
$this->display('Bbb/add' );
./Weibo/Home/View/default/Bbb/add.tpl
//修改默认模版,模块加目录加模版
$this->display('Admin@Bbb/add' );
./Weibo/Admin/View/default/Bbb/add.tpl
//修改默认模版,主题加目录加模版
$this->theme('blue' )->display('Bbb/add' );
./Weibo/Home/View/blue/Bbb/add.tpl
//修改默认模版,自定义模版
$this->display('./Template/Public/add.tpl' );
./Template/Public/add.tpl //Template 和 Weibo 同级
//修改默认模版,指定编码和文件类型,一般不用填写,默认即可
$this->display('add' , 'utf-8' , 'text/xml' )
三. 模版地址
ThinkPHP 封装了一个 T 函数,专门用于生成模版文件。格式如下:
T([资源://][模块@][主题/][控制器/] 操作,[视图分层]);
//输出当前模版地址
echo T();
当然可以结合上面讲的所有定义方法来自定义模版:
echo T('Public/add' )
echo T('Admin@index' );
echo T('Admin@Public/add' , 'Template' );
//直接使用T函数输出
$this->display(T());
四. 获取内容
如果需要获取模版的内容,可以使用 fetch()方法,这个方法的使用和 display()方法一致。
//获取模版里的内容
$content = $this->fetch();
var_dump($content);
//通过内容再渲染输出
$this->show($content);
PS:使用 fetch()方法获取内容,主要是为了可以处理和过滤更加复杂的内容。然后处理后再由 show()方法输出。
模版基础
一. 变量输出
在模版中输出变量是非常容易的, 使用 assign()方法, 以键值对的方式传递变量和值。
//给模版传递一个变量
$user = ' 蜡笔小新' ;
$this->assign('user' , $user);
在模版中可以这么调用:
{$user}
模版标签{和$之间不能用任何空格,否则无法解析。如果你想更换两个{}可以设置:
//修改默认标签
'TMPL_L_DELIM'=>'<{',
'TMPL_R_DELIM'=>'}>',
调用方式就必须改变:
<{$user}>
二. 系统变量
在模版中,不但可以输出 PHP 的系统变量,还可以输出 ThinkPHP 的系统变量。
//输出PHP系统变量
{$Think.server.script_name} //$_SERVER[' SCRIPT_NAME' ]
{$Think.session.admin} //$_SESSION[' admin' ]
{$Think.get.user} //$_GET[' user' ]
{$Think.post.user} //$_POST[' user' ]
{$Think.request.user} //$_REQUEST[' user' ]
{$Think.cookie.name} //$_COOKIE[' name' ]
//ThinkPHP的系统变量
{$Think.const.APP_PATH} //目录
{$Think.config.url_model} //URL模式
{$Think.lang.var_error} //语言变量
三. 使用函数
如果有时,我们需要在模版中使用 PHP 函数的话,可以按照下面的格式使用:
{$user|md5}
如果有多个参数要传递,可以参考如下设置:
{$date|date="Y-m-d H:i:s",###}
前面输出变量,在后面定义,则不需要###
{$user|mb_substr=0,3,'UTF-8'}
多个函数用"| "隔开即可
{$user|mb_substr=0,3,'UTF-8'|md5|sha1}
四.使用运算符
我们可以在模版中使用运算符,包括对“+”、“-”、“*”、“/”、“%”、“--” 和“++”的支持。
{$data['num']+10} //中括号
{$data['num']+getNum()} //函数
PS:在使用运算符的时候,不再支持语法和常规的函数用法:
{$data.num+10} //错误的
{$data['num']+getNum} //错误
模版还支持三元运算符:
{$user ? ' 有值' : ' 无值'}
五.包含文件
在一个系统中,可以包含通用的头文件和脚文件: header 和 footer。由于每个页面的头脚都是相同的,所以需要独立分离出来,再用包含文件引入他们。
我们可以在 View 目录下 default 主题目录下创建一个 public 目录, 这个目录专门存放公共调用模版文件。
<include file='Public/header' />
<include file='Public/footer' />
也可以调用绝对路径模式:
<include file='./Weibo/Home/View/default/Public/header.tpl' />
同时调用多个模版文件:
<include file='Public/header,Public/footer' />
六.模版注释
模版支持注释功能,提供个模版制作人员参考。
{//这是注释}
{/*这也是注释*/}
{/*这是
多行注释*/}
七. 模版继承
模版继承是一项灵活的模版布局方式, 它类似于子类继承父类, 然后子类还可以进行适当的修改以满足当前页面的需要。
//基础模版需要子模版修改的部分可以用<block>包含,并且设置name值
<block name="main">主要内容</block>
//子模版只要按同样的方法,修改<block>内部的值即可完成修改
<block name="main">修改了</block>
八.模版布局
九.模版替换
在模版渲染之前, 系统还会对读取的模版内容进行一些特殊字符串替换操作, 也就实现了模版输出的替换和过滤。
__ROOT__: 会替换成当前网站的地址(不含域名) /tp3_2
__APP__: 会替换成当前应用的 URL 地址 (不含域名)/tp3_2/index.php
__MODULE__:会替换成当前模块的 URL 地址 (不含域名)/index.php/Home
__CONTROLLER__(或者__URL__ 兼容考虑): 会替换成当前控制器的 URL 地址(不含域名) /tp3_2/index.php/Home/User
__ACTION__:会替换成当前操作的 URL 地址 (不含域名)
__SELF__: 会替换成当前的页面 URL
__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/
'TMPL_PARSE_STRING' =>array(
'__PUBLIC__' => '/Common' , // 更改默认的/Public 替换规则
'__UPLOAD__' => '/Uploads' , // 增加新的上传路径替换规则
)
内置标签…
图像处理
一. 实例化类库
//实例化图像处理类,默认为GD库
$image = new Image();
//采用Imageick扩展库,默认没安装
$image = new Image(Image:: IMAGE_IMAGICK);
$image = new Image('Imagick' );
PS: Imageick 扩展库在处理更加复杂的图像上具有很强的优势, 但如果只是一些普通的需求,使用 GD 库完全够用。
二.获取图像信息
//实例化图象处理类库
$image = new Image();
//加载一张预处理的图片
$image->open('./Public/1.jpg' );
//上面两句,可以用一句话包含
$image = new Image(Image:: IMAGE_GD, './Public/1.jpg' );
//获取图片信息
$arr['width' ] = $image->width();
$arr['height' ] = $image->height();
三. 图像处理
使用 crop()和 save()方法可以实现图像的裁剪功能。
//裁剪图片,高400,宽400
$image->crop(400,400)->save('./Public/2.jpg' );
//裁剪图片, 坐标100,100开始裁剪
$image->crop(400,400,100,100)->save('./Public/2.jpg' );
//裁剪图片, 生成后的图片压缩成高宽200
$image->crop(400,400,100,100,200,200)->save('./Public/2.jpg' );
使用 thumb 方法生成缩略图。
//生成缩略图
$image->thumb(300,300)->save('./Public/2.jpg' );
PS:虽然我们设置了宽高 300,但实际上它是 300 x 168,因为生成缩略图采用默认等比例缩放的。如果想用其它缩略图模式,可以使用以下方式。
IMAGE_THUMB_SCALE = 1 ; //等比例缩放类型
IMAGE_THUMB_FILLED = 2 ; //缩放后填充类型
IMAGE_THUMB_CENTER = 3 ; //居中裁剪类型
IMAGE_THUMB_NORTHWEST = 4 ; //左上角裁剪类型
IMAGE_THUMB_SOUTHEAST = 5 ; //右下角裁剪类型
IMAGE_THUMB_FIXED = 6 ; //固定尺寸缩放类型
//生成缩略图,以中心点截取,直接传3也可以
$image->thumb(300,300,Image::IMAGE_THUMB_CENTER)->save('./Public/2.jpg' );
使用 water()方法可以生成一张包含水印的图片。
//在图片右下角添加水印并生成
$image->water('./Public/logo.png' )->save('./Public/2.jpg' );
由于默认是右下角水印位置,如果想更改水印位置,可以在第二参数使用如下:
IMAGE_WATER_NORTHWEST = 1 ; //左上角水印
IMAGE_WATER_NORTH = 2 ; //上居中水印
IMAGE_WATER_NORTHEAST = 3 ; //右上角水印
IMAGE_WATER_WEST = 4 ; //左居中水印
IMAGE_WATER_CENTER = 5 ; //居中水印
IMAGE_WATER_EAST = 6 ; //右居中水印
IMAGE_WATER_SOUTHWEST = 7 ; //左下角水印
IMAGE_WATER_SOUTH = 8 ; //下居中水印
IMAGE_WATER_SOUTHEAST = 9 ; //右下角水印
//更改水印到左上角
$image->water('./Public/logo.png' , Image:: IMAGE_WATER_NORTHWEST)->save('./Public/2.jpg' );
//设置水印的透明度,默认为80, 1-100之间
$image->water('./Public/logo.png' , Image:: IMAGE_WATER_NORTHWEST, 30) ->save('./Public/2.jpg' );
//设置文本水印
$image->text('YCKU.COM' , './Public/consola.ttf' , 20, '#ffffff' ,
Image:: IMAGE_WATER_SOUTHEAST)->save('./Public/2.jpg' );
验证码
一. 生成验证码
//实例化验证码类
$verify = new Verify();
//生成一个验证码图形
$verify->entry();
PS: 生成的验证码会将信息保存在session中, 可以使用print_r($_SESSION) 来查看。
如果想生成多个验证码,可以传递数字参数即可。
//生成第一个验证码
$verify->entry(1);
//生成第二个验证码
$verify->entry(2)
二.验证码参数
//设置验证码参数
$config = array(
'fontSize' =>30, //验证码字体大小
'length' =>3, //验证码位数
'useNoise' =>false, //关闭验证码杂点
);
//实例化验证码类,并传入参数
$verify = new Verify($config);
//生成验证码
$verify->entry();
上面,采用的配置变量方式来修改验证码参数,也可以使用动态设置方法:
//实例化验证码类,并传入参数
$verify = new Verify();
//验证码字体大小
$verify->fontSize = 30;
//验证码位数
$verify->length = 3;
//关闭验证码杂点
$verify->useNoise = false;
//生成验证码
$verify->entry();
//设置验证码的长度
$verify->length = 3;
//设置验证码加密密钥
$verify->seKey = 'YCKU.COM' ;
//设置验证码背景颜色
$verify->bg = array(200,200,200);
如果想让验证码显示中文字符,那么需要几个步骤:
1. 在 Think/zhttfs 文件夹下引入中文字体文件,比如加粗雅黑 msyhbd.ttf;
2. 设置字体文件;
//设置验证码字体
$verify->fontttf = 'msyhbd.ttf' ;
3. 设置中文验证码
//设置中文验证码
$verify->useZh = true;
PS:由于中文字符较为庞大,你也可以限定指定的中文字符。
//限定中文字符
$verify->zhSet = ' 李炎恢是个好人' ;
//设置纯数字
$verify->codeSet='0123456789' ;
三. 验证码检测
我们可以使用 Verify.class.php 类中的 check 方法检测验证码是否输入正确。
第一步:在 function.php 里构建一个函数:
//函数$code 是验证码字符, $id 是第几个验证码,如果只有一个,可以忽略
function check_verify($code, $id = '' ){
$verify = new \Think\Verify();
return $verify->check($code, $id);
}
//通过输入验证,来验证,是否返回 true
public function test($code) {
echo $code;
var_dump(check_verify($code)); //($code, 1)
}
文件上传
一. 上传表单
//上传单个文件的表单模式
<form action="__CONTROLLER__/upload"
enctype="multipart/form-data" method="post">
<input type="text" name="name" />
<input type="file" name="photo" />
<input type="submit" value="提交" />
</form>
//多文件上传设置,或者改为 photo1, photo2, photo3 即可
<input type="file" name="photo[]" />
<input type="file" name="photo[]" />
<input type="file" name="photo[]" />
在控制器里创建一个 upload 方法,实现上传功能:
//上传功能
public function upload() {
$upload = new Upload(); //实例化上传类
$upload->maxSize = 3145728; //设置上传大小,字节
$upload->exts = array('jpg' , 'gif' , 'png' , 'jpeg' ); //限定后缀
$upload->savePath = './' ; //在根目录Uploads下
$info = $upload->upload(); //执行上传方法
if (!$info) {
$this->error($upload->getError()); //错误了
} else {
$this->success(' 上传成功! ' ); //成功了
}
}
二. 文件上传
//实例化配置参数
$config = array(
'maxSize' =>3145728,
'exts' =>array('jpg' , 'gif' , 'png' , 'jpeg' ),
'savePath' =>'./' ,
);
$upload = new Upload($config);
//动态配置参数
$upload = new Upload();
$upload->maxSize = 3145728;
$upload->exts = array('jpg' , 'gif' , 'png' , 'jpeg' );
$upload->savePath = './' ;
//设置文件名
$upload->saveName = '123' ;