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');
  • 5、刪除

    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">密&nbsp;&nbsp;&nbsp;&nbsp;码</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();
    }
  • 二、Cookie

要使用Cookie類別必須使用門面方式(

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

1、使用快取

// 缓存在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###類別###
########################################################################################################################。 #think\Lang###### think\facade\Lang#############think\Log ######think\facade\Log########## # ###think\Middleware######think\facade\Middleware#############think\Request######think\facade\Request####### # #####think\Response######think\facade\Response############think\Route######think\facade\Route#### ## #######think\Session######think\facade\Session######
(動態)類別庫Facade類別
think\Appthink\facade\App
think\Cachethink\facade\Cache
think\Configthink\facade\Config
think\Cookiethink\facade\Cookie
think\Db think\facade\Db
think\Env think\facade\Env
think \Eventthink\facade\Event
think\Filesystemthink\facade\Filesystem
think\Validatethink\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 系統為一些常用的操作方法封裝了助手函數

#input 取得輸入資料支援預設值與篩選###JSONP資料輸出取得語言變數值字串命名風格轉換#重定向輸出取得目前Request物件實例化Response物件#Session管理產生表單令牌輸出記錄日誌資訊#### ########trait_uses_recursive ###### 取得一個trait裡所有引用到的trait############url ############################################################## #######validate ######實例化驗證器#############view ######渲染模板輸出########config_path 應用程式設定目錄public_path web根目錄root_path 應用根目錄runtime_path 應用執行階段目錄
助理函數描述
#abort #中斷執行並傳送HTTP狀態碼
app #快速取得容器中的執行個體支援依賴注入
bind 快速綁定物件實例
cache 快取管理
class_basename 取得類別名稱(不包含命名空間)
class_uses_recursive #取得一個類別裡所有用到的trait
config取得與設定設定參數
cookie Cookie管理
download 取得\think\ response\Download物件實例
dump #瀏覽器友善的變數輸出
env #取得環境變數
event #觸發事件
#halt 變數偵錯輸出並中斷執行
invoke 呼叫反射執行callable 支援依賴注入
json JSON資料輸出
jsonp
lang 
parse_name
redirect 
request 
response 
session 
token 
#trace 
display 渲染內容輸出
#xml XML資料輸出
# app_path 目前應用目錄
base_path 應用程式基礎目錄



// 取得輸入數據,跟Request::param()效果一樣

    $param = input();
  • // 變數偵錯輸出併中斷執行##$ shop = Db::table('shop_goods')->select();

    halt($shop);
// 渲染模板輸出,跟View::fetch()效果一樣

return view();

#七、偵錯

1、偵錯模式與Trace偵錯

##根目錄裡
    .env
  • 檔案

  • // 開啟偵錯模式與Trace偵錯
APP_DEBUG = true

#備:正式部署後關閉偵錯模式

2、變數偵錯

#######ThinPHP內建了###dump ###偵錯方法###### #########$shop = Db::table('shop_goods')->select();######dump($shop);######## # ##