ThinkPHP6.0 雜項
一、Session
要使用
Session
類別必須使用門面方式(think\facade\Session
)呼叫新版本不支援操作原生
$_SESSION
陣列和所有session_
開頭的函數,只能透過Session類別(或助手函數)來操作
1、設定檔session.php
return [ // session name 'name' => 'PHPSESSID', // SESSION_ID的提交变量,解决flash上传跨域 'var_session_id' => '', // 驱动方式 支持file cache 'type' => 'file', // 存储连接标识 当type使用cache的时候有效 'store' => null, // 过期时间 'expire' => 1440, // 前缀 'prefix' => '', ];
2、開啟Session
中間件
app\middleware.php
檔案
\think\middleware\SessionInit::class
3、設定
session 支援多層數組操作
- #
Session::set('name','欧阳克'); // Session数组 Session::set('admin.name','欧阳克'); Session::set('admin.uid',1);4、讀取
// 获取全部Session Session::all(); // 获取Session中name的值 Session::get('name');
Session::delete('name');6、取值並刪除
Session::pull('name');7、登陸範例
- #新login.php檔案
namespace app\controller; use think\facade\View; use think\facade\Db; use think\facade\Request; use think\facade\Session; class Login{ public function index(){ if(Request::method() == 'POST'){ $all = Request::param(); $admin = Db::table('shop_admin')->where('account',$all['account'])->find(); if(empty($admin)){ echo json_encode(['code'=>1,'msg'=>'未找到管理员']); exit; } if(md5($all['pwd']) != $admin['password']){ echo json_encode(['code'=>1,'msg'=>'密码错误']); exit; } Session::set('uid',$admin['uid']); Session::set('account',$admin['account']); echo json_encode(['code'=>0,'msg'=>'登陆成功']) ; }else{ $title = '商城'; View::assign([ 'title' => $title ]); return View::fetch(); } } }
- #新Login/index.html檔案
<!DOCTYPE html> <html> <head> <title>登录</title> <link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css"> <script type="text/javascript" src="/static/layui/layui.js"></script> </head> <body style="background: #1E9FFF"> <div style="position: absolute; left:50%;top:50%;width: 500px;margin-left: -250px;margin-top: -200px;"> <div style="background: #ffffff;padding: 20px;border-radius: 4px;box-shadow: 5px 5px 20px #444444;"> <form class="layui-form"> <div class="layui-form-item" style="color:gray;"> <h2>{$title}--后台管理系统</h2> </div> <hr> <div class="layui-form-item"> <label class="layui-form-label">用户名</label> <div class="layui-input-block"> <input type="text" id="account" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">密 码</label> <div class="layui-input-block"> <input type="password" id="password" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button type="button" class="layui-btn" onclick="dologin()">登录</button> </div> </div> </form> </div> </div> <script type="text/javascript"> layui.use(['layer'],function(){ $ = layui.jquery; layer = layui.layer; // 用户名控件获取焦点 $('#account').focus(); // 回车登录 $('input').keydown(function(e){ if(e.keyCode == 13){ dologin(); } }); }); function dologin(){ var account = $.trim($('#account').val()); var pwd = $.trim($('#password').val()); if(account == ''){ layer.alert('请输入用户名',{icon:2}); return; } if(pwd == ''){ layer.alert('请输入密码',{icon:2}); return; } $.post('/index.php/login/index',{'account':account,'pwd':pwd},function(res){ if(res.code>0){ layer.alert(res.msg,{icon:2}); }else{ layer.msg(res.msg); setTimeout(function(){window.location.href = '/index.php/index/index'},1000); } },'json'); } </script> </body> </html>index/index.html檔案
use think\facade\Session; public function index(){ $title = '商城'; $session = Session::all(); if(empty($session['uid'])){ echo '<script type="text/javascript">alert("请登录!");window.location.href = "/index.php/login/index"; </script>'; exit; } $login = $session['account']; # 左侧菜单 $menu = Db::table('shop_menu')->where('fid',0)->select(); $left = $menu->toArray(); foreach($left as &$left_v){ $left_v['lists'] = Db::table('shop_menu')->where('fid',$left_v['id'])->select(); } # 右侧列表 $param = Request::param(); if(isset($param['status']) && $param['status'] == 1){ $where['status'] = 1; }else if(isset($param['status']) && $param['status'] == 2){ $where['status'] = 2; }else{ $where = true; } $p = isset($param['p']) ? $param['p'] : 1; $db = new Goods(); $order = [ 'add_time DESC', 'id DESC' ]; $right = $db->get_all($where,$order,$p,5); View::assign([ 'title' => $title, 'login' => $login, 'left' => $left, 'right' => $right['data'], 'count' => $right['count'], 'p' => $p, 'status' => isset($param['status']) ? $param['status'] : 0 ]); return View::fetch(); }
think\facade\Cookie
)呼叫設定檔位於設定目錄下的cookie.php文件,無需手動初始化,系統會在呼叫之前自動進行Cookie初始化工作
- 1、使用Cookie
// 设置Cookie 有效期为 3600秒 Cookie::set('name', '欧阳克', 3600); // 永久保存Cookie Cookie::forever('name', '欧阳克'); //删除cookie Cookie::delete('name'); // 读取某个cookie数据 Cookie::get('name');
2、Cookie 設定檔
config 目錄下cookie.php 檔案
return [ // cookie 保存时间 'expire' => 0, // cookie 保存路径 'path' => '/', // cookie 有效域名 'domain' => '', // cookie 启用安全传输 'secure' => false, // httponly设置 'httponly' => false, // 是否使用 setcookie 'setcookie' => true, ];
三、快取
think\facade\Cache
)呼叫
- 內建支援的快取類型包括
file
、 memcache
wincache
、- sqlite
- 、
redis
// 缓存在3600秒之后过期
Cache::set('number', 10, 3600);
// number自增(步进值为3)
Cache::inc('number',3);
// number自减(步进值为1)
Cache::dec('number');
// 获取缓存
Cache::get('number');
// 删除缓存
Cache::delete('number');
// push 追加缓存
Cache::set('name', ['欧阳克','朱老师']);
Cache::push('name', '西门大官人');
// 获取并删除缓存
Cache::pull('name');
// 清空缓存
Cache::clear();
2、快取設定檔
###config 目錄下cache.php檔案
return [ // 默认缓存驱动 'default' => 'file', // 缓存连接方式配置 'stores' => [ 'file' => [ // 驱动方式 'type' => 'File', // 缓存保存目录 'path' => '', // 缓存前缀 'prefix' => '', // 缓存有效期 0表示永久缓存 'expire' => 0, // 缓存标签前缀 'tag_prefix' => 'tag:', // 序列化机制 例如 ['serialize', 'unserialize'] 'serialize' => [], ], // redis缓存 'redis' => [ // 驱动方式 'type' => 'redis', // 服务器地址 'host' => '127.0.0.1', ], // 更多的缓存连接 ], ];
###四、公用控制器################BaseController.php### 預設基礎控制器類別##### ####use think\facade\View; use think\facade\Db; use think\facade\Session; public function initialize(){ $session = Session::all(); if(empty($session['uid'])){ echo '<script type="text/javascript">alert("请登录!");window.location.href = "/index.php/login/index"; </script>'; exit; } $login = $session['account']; # 左侧菜单 $menu = Db::table('shop_menu')->where('fid',0)->select(); $left = $menu->toArray(); foreach($left as &$left_v){ $left_v['lists'] = Db::table('shop_menu')->where('fid',$left_v['id'])->select(); } View::assign([ 'login' => $login, 'left' => $left, ]); } Index/Index.php namespace app\controller; use app\BaseController; use think\facade\View; use think\facade\Db; use think\facade\Request; use app\model\Goods; class Index extends BaseController{ public function index(){ $title = '商城'; # 右侧列表 $param = Request::param(); if(isset($param['status']) && $param['status'] == 1){ $where['status'] = 1; }else if(isset($param['status']) && $param['status'] == 2){ $where['status'] = 2; }else{ $where = true; } $p = isset($param['p']) ? $param['p'] : 1; $db = new Goods(); $order = [ 'add_time DESC', 'id DESC' ]; $right = $db->get_all($where,$order,$p,5); View::assign([ 'title' => $title, 'right' => $right['data'], 'count' => $right['count'], 'p' => $p, 'status' => isset($param['status']) ? $param['status'] : 0 ]); return View::fetch(); } }
###五、門面Facade############門面為容器中的(動態)類別提供了一個靜態調用接口,相比於傳統的靜態方法調用, 帶來了更好的可測試性和擴展性,你可以為任何的非靜態類別庫定義一個###facade###類別###
(動態)類別庫 | Facade類別 |
think\App | think\facade\App |
think\Cache | think\facade\Cache |
think\Config | think\facade\Config |
think\Cookie | think\facade\Cookie |
think\Db | think\facade\Db |
think\Env | think\facade\Env |
think \Event | think\facade\Event |
think\Filesystem | think\facade\Filesystem |
think\Validate | think\facade\Validate |
#think\View | think\facade\View |
1、Facade類別
門面為容器中的(動態)類別提供了一個靜態調用接口,相較於傳統的靜態方法調用,帶來了更好的可測試性和擴充性
系統已經為大部分核心類別庫定義了Facade,所以你可以透過Facade來存取這些系統類別
use think\facade\App; use think\facade\Db; use think\facade\View; use think\facade\Request; use think\facade\Session; class Index{ public function index(){ // 数据库操作 $select = Db::table('shop_goods')->select(); // 请求对象 $param = Request::param(); // Session $session = Session::all(); // 视图 return View::fetch(); } }
2、(動態)類別庫
use think\App; use think\Db; use think\View; use think\Request; use think\Session; class Index{ public function index(View $view,Db $db){ $select = $db->table('shop_goods')->select(); $view->assign([ 'name' => '欧阳克', 'select' => $select ]); return $view->fetch(); } }
六、助手函數
#Thinkphp 系統為一些常用的操作方法封裝了助手函數
助理函數 | 描述 |
#abort | #中斷執行並傳送HTTP狀態碼 |
app | #快速取得容器中的執行個體支援依賴注入 |
bind | 快速綁定物件實例 |
cache | 快取管理 |
class_basename | 取得類別名稱(不包含命名空間) |
class_uses_recursive | #取得一個類別裡所有用到的trait |
config | 取得與設定設定參數 |
cookie | Cookie管理 |
download | 取得\think\ response\Download物件實例 |
dump | #瀏覽器友善的變數輸出 |
env | #取得環境變數 |
event | #觸發事件 |
#halt | 變數偵錯輸出並中斷執行 |
#input | 取得輸入資料支援預設值與篩選 |
invoke | 呼叫反射執行callable 支援依賴注入 |
json | JSON資料輸出 |
jsonp | |
lang | |
parse_name | |
redirect | |
request | |
response | |
session | |
token | |
#trace | |
display | 渲染內容輸出 |
#xml | XML資料輸出 |
# app_path | 目前應用目錄 |
base_path | 應用程式基礎目錄 |
應用程式設定目錄 | |
web根目錄 | |
應用根目錄 | |
應用執行階段目錄 |
// 取得輸入數據,跟Request::param()效果一樣
- $param = input();
// 變數偵錯輸出併中斷執行
halt($shop);##$ shop = Db::table('shop_goods')->select();
return view();
#七、偵錯
1、偵錯模式與Trace偵錯
##根目錄裡- .env
- 檔案
APP_DEBUG = true2、變數偵錯#######ThinPHP內建了###dump ###偵錯方法###### #########$shop = Db::table('shop_goods')->select();######dump($shop);######## # ###備:正式部署後關閉偵錯模式