上传
如果要实现上传功能,首先需要建立一个上传表单,具体如下:
<form action="http://localhost/tp6/public/upload"
enctype="multipart/form-data" method="post">
<input type="file" name="image">
<input type="submit" value="确定">
</form>
创建一个控制器upload.php,并使用 Request::file来获取上传数据:
//获取表单的上传数据
$file = Request::file('image');
使用Filesystem::putfile()方法,来实现上传文件,并写入指定目录,上传后返回的结果$info,可以输出当前上传文件的地址:
//目录在runtime/storage/toppic/时间/文件
$info = Filesystem::putFile('topic', $file);
如果想更改上传文件的默认配置,在config/filesystem.php中配置:
'root' => app()->getRuntimePath() . 'storage',
默认规则下,上传的文件是以日期和微秒生成的方式:date,生成的规则还支持另外两种方式:md5和sha1:
$info = Filesystem::putFile('topic', $file, 'md5');
批量上传,使用 image[]作为名称,并使用 foreach()遍历上传:
<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">
$files = Request::file('image'); $info = [];
foreach ($files as $file) {
$info[] = Filesystem::putFile('topic', $file);
}
dump($info);
结合之前的验证器,我们写一个针对 upload的独立验证:
//上传图片文件
$file = Request::file('image');
//编写上传规则,必须是上传文件,必须是jpg.png.gif后缀
$validate = Validate::rule([
'image' => 'file|fileExt:jpg,png,gif'
]);
//得到上传文件和规则比对
$result = $validate->check([
'image' => $file
]);
//通过输出地址,否则输出错误
if ($result) {
$info = Filesystem::putFile('topic', $file);
dump($info);
} else {
dump($validate->getError());
}
多语言
多语言
如果要开启多语言切换功能,中间件定义文件middleware.php开启:
// 多语言加载
\think\middleware\LoadLangPack::class,
配置文件在 config/lang.php文件,默认设置的是zh-cn中文语言:
'zh-hans-cn' => 'zh-cn',
//自动监测的变量为lang
'detect_var' => 'lang',
默认应用目录会调用 app\lang目录下的语言包,创建三个:
//错误信息,zh-cn.php
return [
'require_name' => '用户名不得为空!',
'email_error' => '邮箱地址不正确!',
];
//error message,en-us.php
return [
'require_name' => 'The user name cannot be empty!',
'email_error' => 'Incorrect email address!',
];
//エラーメッセージ, ja-jp.php
return [
'require_name' => 'ユーザ名は空ではいけません!',
'email_error' => 'メールアドレスが間違っています!',
];
系统默认会指定:zh-cn这个语言包,我们通过::get()来输出错误信息:
Lang::get('require_name');
//助手函数
lang('require_name');
通过 URL方式来切换语言,?lang=en-us即可,cookie自动生成,而下一次就算不带?lang=en-us,默认就会执行 cookie的语言包。也可以在配置文件中,设置允许的语言包,默认为空,具体如下:
// 允许的语言列表
'allow_lang_list' => ['zh-cn','en-us','ja-jp'],
在模版中调用语言信息,可以用{$Think.lang.xxx}:
{$Think.lang.require_name}
{:lang('email_error')}
可以在配置文件中开启多语言分组,运行使用二维数组来实现语言包定义:
// 是否支持语言分组
'allow_group' => true,
'user' => [
'welcome' => '欢迎光临!',
'login' => '登入成功!',
'logout' => '退出成功!',
]
Lang::get('user.login');
验证码
验证码功能不是系统内置的功能了,需要通过 composer引入进来:
composer require topthink/think-captcha //开启session方可使用
引入进来之后,我们在模版中,验证一下验证码是否能正常显示:
<div>{:captcha_img()}</div>
<div><img src="{:captcha_src()}" alt="captcha" /></div>
创建一个模版页面,设置一个验证码和文本框提交比对:
<form action="../code/check" method="post">
<input type="text" name="code">
<input type="submit" value="验证">
</form>
使用validate验证器来对验证码进行检测:
//验证码验证规则
$validate = Validate::rule([
'captcha' => 'require|captcha'
]);
//验证码和表单对比
$result = $validate->check([
'captcha' => input('post.code')
]);
if (!$result) {
dump($validate->getError());
}
也可以使用助手函数直接进行判断验证:
if(!captcha_check(input('post.code'))){
dump('验证失败');
}
验证码的所有配置参数如下,根据需要进行调用:
配置文件在config/captcha.php中,直接进行参数配置即可:
return [
//字体大小
'fontSize' => 30,
//验证码位数
'length' => 3,
//验证码杂点
'useNoise' => false,
];
我们可以自定义一个验证器,创建一个verify方法生成:
public function verify()
{
return Captcha::create('verify');
}
// 添加额外的验证码设置
'verify' => [
'length'=>3,
],
// 路由访问验证码
Route::rule('vc', 'Code/verify');
分页
分页功能
不管是数据库操作还是模型操作,都使用paginate()方法来实现:
//查找user表所有数据,每页显示5条
return View::fetch('index', [
'list' => User::paginate(5)
]);
创建一个静态模版页面,并使用{volist}标签遍历列表:
<table border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
<th>价格</th>
</tr>
{volist name='list' id='user'}
<tr>
<td>{$user.id}</td>
<td>{$user.username}</td>
<td>{$user.gender}</td>
<td>{$user.email}</td>
<td>{$user.price}</td>
</tr>
{/volist}
</table>
分页功能还提供了一个固定方式,实现分页按钮,只需要设置相应的CSS即可:
{$list|raw}
<ul class="pagination">
.pagination {
list-style: none;
margin: 0;
padding: 0; }
.pagination li {
display: inline-block;
padding: 20px;
}
我们可以通过数组来传递多个参数,具体分页参数如下:
$list = User::paginate([
'list_rows' => 4,
'var_page' => 'page',
]);
也可以单独赋值分页的模版变量:
// 获取分页显示
$page = $list->render();
{$page|raw}
也可以单独获取到总记录数量:
$total = $list->total();
如果你使用模型方式分页,则可以通过获取器修改字段值,而分页本身也可以:
->each(function ($item, $key) {
$item['gender'] = '【'.$item['gender'].'】';
return $item;
});
可以限定总记录数,比如,限定总记录数只有10条的页码:
->paginate(5, 10);
也可以设置分页的页码为简洁分页,就是没有 1,2,3,4这种,只有上下页:
->paginate(5, true);
图像处理
图像处理功能
图像处理功能不是系统内置的功能了,需要通过composer引入进来:
composer require topthink/think-image
引入进来之后,首先创建图像处理对象:
$image = Image::open('image.png');
获得了图像处理对象后,可以得到这张图片的各种属性:
//图片宽度
echo $image->width();
//图片高度
echo $image->height();
//图片类型
echo $image->type();
//图片mime
echo $image->mime();
//图片大小
dump($image->size());
使用crop()方法可以裁剪图片,并使用save()方法保存到指定路径。(可以点击追踪方法内部,参看源码参数,了解更多的传值方法):
//裁剪图片
$image->crop(550,400)->save('crop1.png');
使用thumb()方法,可以生成缩略图,配合save()把缩略图保存下来。(thumb n. 拇指;(手套的)拇指部分):
//生成缩略图
$image->thumb(500,500)->save('thumb1.png');
这里要注意一个问题,虽然设置了宽和高,但高度变成了 282,说明是等比例的。可以点击追踪方法内部,第三个参数默认为:$type = self::THUMB_SCALING,而这个常量设置的定义如下:
/* 缩略图相关常量定义*/
const THUMB_SCALING = 1; //常量,标识缩略图等比例缩放类型
const THUMB_FILLED = 2; //常量,标识缩略图缩放后填充类型
const THUMB_CENTER = 3; //常量,标识缩略图居中裁剪类型
...
使用rotate()方法,可以旋转图片,默认是90度,参数可以设置:
$image->rotate(180)->save('rotate1.png');
save()方法可以配置的参数除了保存文件名的路径,还有如下所示:save('路径',['类型','质量','是否隔行扫描']),追踪到方法查看:
save($pathname, $type = null, $quality = 80, $interlace = true)
water()方法,可以给图片增加一个图片水印,默认位置为右下角,可看源码常量:
$image->water('mr.lee.png')->save('water1.png');
text()方法,可以给图片增加一个文字水印,具体如下:
$image->text('Mr.Lee',getcwd().'/1.ttf',20,'#ffffff')->save('text1.png');