Session

Session

  1. 在使用Session之前,需要开启初始化,在中间件文件middleware.php;
// Session初始化
\think\middleware\SessionInit::class

QQ截图20200806133354.png

  1. TP6.0 不支持原生$_SESSION的获取方式,也不支持session_开头的函数;
  2. 直接使用::set()::get()方法去设置Session的存取;
Session::set('user', 'Mr.Lee'); //设置 session,参数 1 名称,参数 2 值
Session::get('user'); //读取 session,参数为名称
Session::all(); //读取Session所有内容
Request::session('user'); //读取 session,参数为名称
Request::session(); //读取Session所有内容

QQ截图20200806133842.png

  1. ::get()第二参数,可以设置当不存在值的时候,设置一个默认值;
Session::get('name'); //name 不存在时返回 null
Session::get('name', ''); //name 不存在时返回空

QQ截图20200806133939.png

  1. ::has()判断是否赋值,::delete()删除,::pull()取值后删除;
Session::has('user');
Session::delete('user');
Session::pull('user'); //不存在则返回 null

QQ截图20200806134027.png

  1. ::clear()清空整个session;
Session::clear('');
  1. ::flash()方法,设置闪存数据,只请求一次有效的情况,再请求会失效;
Session::flash('user','Mr.Lee');

二维和助手函数

  1. 二维操作,就是对象和数组的调用方式,如下:
// 赋值(当前作用域)
Session::set('obj.user','Mr.Lee');
// 判断(当前作用域)是否赋值
Session::has('obj.user');
// 取值(当前作用域)
Session::get('obj.user');
// 删除(当前作用域)
Session::delete('obj.user');

QQ截图20200806134203.png

  1. 助手函数,更加方便操作,如下:
//赋值
session('user', 'Mr.Wang');
//has 判断
session('?user');
//delete 删除
session('user', null);
//清理全部
session(null);
//输出
echo session('user');

QQ截图20200806134248.png

Cookie

  1. Cookie是客户端存储,默认情况下是开启初始化的,在config/cookie.php;
  2. ::set()方法,创建一个最基本的cookie,可以设置前缀,过期时间,数组等;
Cookie::set('user', 'Mr.Lee'); //临时保存,关闭浏览器消失
Cookie::set('user', 'Mr.Lee', 3600); //3600 秒
Request::cookie('user');
Request::cookie();

QQ截图20200806134401.png

  1. ::forever()方法,永久保存Cookie(就是十年的意思);
Cookie::forever('user', 'Mr.Lee');
  1. ::has()判断是否存在,:get()取值,::delete()删除cookie;
Cookie::has('user');
Cookie::get('user');
Cookie::delete('user');

助手函数

  1. 助手函数,更加方便操作,如下:
echo cookie('user'); //输出
cookie('user', 'Mr.Lee', 3600); //设置
cookie('user', null); //删除

缓存功能

缓存功能

  1. 系统内置了很多类型的缓存,除了File,其它均需要结合相关产品;
  2. 我们这里主要演示File文本缓存,其它的需要学习相关产品;
  3. 配置文件cache.php进行缓存配置,默认生成在runtime/cache目录;
  4. ::set()方法,可以设置一个缓存,参数三为过期时间;
Cache::set('user', 'Mr.Lee');
Cache::set('user', 'Mr.Lee', 3600);
  1. ::has()方法,判断缓存是否存在,返回布尔值;
Cache::has('user');

QQ截图20200806134953.png

  1. ::get()方法,从缓存中获取到相应的数据,无数据返回 null;
Cache::get('user');

QQ截图20200806135017.png

  1. ::inc()::dec()实现缓存数据的自增和自减操作;
Cache::inc('num');
Cache::inc('price', 3);
Cache::dec('num');
Cache::dec('price', 3);
  1. ::push()实现缓存的数组数据追加的功能;
Cache::set('arr', [1,2,3]);
Cache::push('arr', 4);

QQ截图20200806135242.png

  1. ::delete()方法,可以删除指定的缓存文件;
Cache::delete('user');
  1. ::pull()方法,先获取缓存值,然后再删除掉这个缓存,无数据返回null;
Cache::pull('user');

QQ截图20200806135328.png

  1. ::remember()方法,如果数据不存在,则写入数据,可以依赖注入;
Cache::remember('start_time', time());
Cache::remember('start_time', function (Request $request) {});
  1. ::clear()方法,可以清除所有缓存;
Cache::clear();
  1. ::tag()标签,可以将多个缓存归类到标签中,方便统一管理,比如清除;
Cache::tag('tag')->set('user', 'Mr.Lee');
Cache::tag('tag')->set('age', 20);
Cache::tag('tag')->clear();
  1. 助手函数的使用:cache();
//设置缓存
cache('user', 'Mr.Lee', 3600);
//输出缓存
echo cache('user');
//删除指定缓存
cache('user', null);

上传功能

上传功能

  1. 如果要实现上传功能,首先需要建立一个上传表单,具体如下:
<form action="http://tp6/datatest/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="image">
    <input type="submit" value="确定">
</form>
  1. 创建一个控制器,并使用Request::file来获取上传数据:
//获取表单的上传数据
$file = Request::file('image');

QQ截图20200806135742.png

  1. 使用Filesystem::putfile()方法,来实现上传文件,并写入指定目录;
  2. 上传后返回的结果$info,可以输出当前上传文件的地址;
//目录在 runtime/storage/toppic/时间/文件
$info = Filesystem::putFile('topic', $file);

QQ截图20200806135921.png

  1. 如果想更改上传文件的默认配置,在config/filesystem.php中配置;
'root' => app()->getRuntimePath() . 'storage', 

QQ截图20200806140414.png

  1. 默认规则下,上传的文件是以日期和微秒生成的方式:date;
  2. 生成的规则还支持另外两种方式:md5sha1;
$info = Filesystem::putFile('topic', $file, 'md5');

QQ截图20200806140730.png

  1. 批量上传,使用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);

QQ截图20200806140837.png

  1. 结合之前的验证器,我们写一个针对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());
}

QQ截图20200806141030.png

多语言

多语言

  1. 如果要开启多语言切换功能,中间件定义文件middleware.php开启;
// 多语言加载
\think\middleware\LoadLangPack::class, 

QQ截图20200806141250.png

  1. 配置文件在config/lang.php文件,默认设置的是zh-cn中文语言;
'zh-hans-cn' => 'zh-cn',
'detect_var' => 'lang', //自动监测的变量为 lang

QQ截图20200806142643.png

  1. 默认应用目录会调用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' => 'メールアドレスが間違っています!',
];

QQ截图20200806143240.png

  1. 系统默认会指定:zh-cn这个语言包,我们通过::get()来输出错误信息;
Lang::get('require_name');
lang('require_name'); //助手函数

QQ截图20200806143331.png

  1. 通过URL方式来切换语言,?lang=en-us即可,cookie自动生成;

QQ截图20200806143354.png

  1. 而下一次就算不带?lang=en-us,默认就会执行cookie的语言包;
  2. 也可以在配置文件中,设置允许的语言包,默认为空,具体如下:
// 允许的语言列表
'allow_lang_list' => ['zh-cn','en-us','ja-jp'], 

QQ截图20200806143550.png

  1. 在模版中调用语言信息,可以用{$Think.lang.xxx};
{$Think.lang.require_name}
{:lang('email_error')}
  1. 可以在配置文件中开启多语言分组,运行使用二维数组来实现语言包定义;
// 是否支持语言分组

// config/lang.php
'allow_group' => true,

// zh-cn.php
'user' => [
    'welcome' => '欢迎光临!',
    'login' => '登入成功!',
    'logout' => '退出成功!',
],


Lang::get('user.login');

QQ截图20200806144056.png

验证码功能

验证码功能

  1. 验证码功能不是系统内置的功能了,需要通过composer引入进来;
//开启 session 方可使用
composer require topthink/think-captcha
  1. 引入进来之后,我们在模版中,验证一下验证码是否能正常显示;
<div>{:captcha_img()}</div> //可以点击刷新
<div><img src="{:captcha_src()}" alt="captcha" /></div>
  1. 创建一个模版页面,设置一个验证码和文本框提交比对;
<form action="../code/check" method="post">
    <input type="text" name="code">
    <input type="submit" value="验证">
</form>
  1. 使用validate验证器来对验证码进行检测;
//验证码验证规则
$validate = Validate::rule([
    'captcha' => 'require|captcha'
]);
//验证码和表单对比
$result = $validate->check([
    'captcha' => input('post.code')
]);
if (!$result) {
    dump($validate->getError());
}

QQ截图20200806145139.png

  1. 也可以使用助手函数直接进行判断验证;
if(!captcha_check(input('post.code'))){
    dump('验证失败');
}

QQ截图20200806145208.png

  1. 验证码的所有配置参数如下,根据需要进行调用:

QQ截图20200806150129.png

  1. 配置文件在config/captcha.php中,直接进行参数配置即可;
return [
    //字体大小
    'fontSize' => 30,
    //验证码位数
    'length' => 3,
    //验证码杂点
    'useNoise' => false,
];

QQ截图20200806145334.png

  1. 我们可以自定义一个验证器,创建一个verify方法生成;
public function verify()
{
    return Captcha::create('verify');
}

// 添加额外的验证码设置
'verify' => [
    'length'=>3,
],

// 路由访问验证码
Route::rule('vc', 'Code/verify');

QQ截图20200806145726.png

分页功能

分页功能

  1. 不管是数据库操作还是模型操作,都使用paginate()方法来实现;
//查找 user 表所有数据,每页显示 5 条
return View::fetch('index', [
    'list' => User::paginate(5)
]);
  1. 创建一个静态模版页面,并使用{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>

QQ截图20200806150443.png

  1. 分页功能还提供了一个固定方式,实现分页按钮,只需要设置相应的CSS即可;
{$list|raw}

// css
.pagination {
    list-style: none;
    margin: 0;
    padding: 0;
}
.pagination li {
    display: inline-block;
    padding: 2px;
}

QQ截图20200806151020.png

  1. 我们可以通过数组来传递多个参数,具体分页参数如下:
$list = User::paginate([
    'list_rows' => 4,
    'var_page' => 'page',
]);

QQ截图20200806151131.png

  1. 也可以单独赋值分页的模版变量;
// 获取分页显示
$page = $list->render();
{$page|raw}
  1. 也可以单独获取到总记录数量;
$total = $list->total();

QQ截图20200806151534.png

  1. 如果你使用模型方式分页,则可以通过获取器修改字段值,而分页本身也可以;
->each(function ($item, $key) {
    $item['gender'] = '【'.$item['gender'].'】';
    return $item;
});

QQ截图20200806151838.png

  1. 可以限定总记录数,比如,限定总记录数只有10条的页码;
->paginate(5, 10);

QQ截图20200806151941.png

  1. 也可以设置分页的页码为简洁分页,就是没有1,2,3,4这种,只有上下页;
->paginate(5, true);

QQ截图20200806152018.png