[thinkphp6 학습 과정] ThinkPHP6 기타

1. 세션

  • 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. 공개세션

  • 미들웨어 앱\middleware.php 파일
\think\middleware\SessionInit::class

3. 설정

  • 세션은 다단계 배열 작업을 지원합니다.
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 클래스를 사용하려면 파사드 메서드( think\facade\Cookie ) 호출을 사용해야 합니다.
  • 구성 파일은 구성 디렉토리에 있습니다 cookie.php. 수동 초기화 없이 시스템은 쿠키를 호출하기 전에 자동으로 쿠키를 초기화합니다.

1. 쿠키 사용

// 设置Cookie 有效期为 3600秒
Cookie::set('name', '欧阳克', 3600);

// 永久保存Cookie
Cookie::forever('name', '欧阳克');

//删除cookie
Cookie::delete('name');

// 读取某个cookie数据
Cookie::get('name');

2. 쿠키 설정 파일

  • 구성 디렉토리의 cookie.php 파일
return [
    // cookie 保存时间
    'expire'    => 0,
    // cookie 保存路径
    'path'      => '/',
    // cookie 有效域名
    'domain'    => '',
    //  cookie 启用安全传输
    'secure'    => false,
    // httponly设置
    'httponly'  => false,
    // 是否使用 setcookie
    'setcookie' => true,
];

3. 캐시

  • 캐시를 사용하려면 파사드 메서드( 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',
        ],
        // 更多的缓存连接
    ],
];

4. 퍼블릭 컨트롤러

  • 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.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();
    }
}

5. 파사드

  • 파사드는 컨테이너의 (동적) 클래스에 대한 정적 호출 인터페이스를 제공합니다.전통적인 정적 메서드 호출과 비교하여 더 나은 테스트 가능성과 확장성을 제공합니다.비정적 클래스 라이브러리 종류에 대한 파사드를 정의할 수 있습니다.
(동적) 클래스 라이브러리 Facade 클래스
생각\앱 생각\외관\앱
생각\캐시 생각\외관\캐시
생각\구성 생각\외관\구성
생각\쿠키 생각\facade\쿠키
생각\Db 생각\facade\Db
생각\환경 생각\외관\환경
생각\이벤트 생각\외관\이벤트
생각\파일 시스템 생각\외관\파일 시스템
생각\랭 생각\외관\랭
생각\로그 생각\외관\로그
생각\미들웨어 think\facade\미들웨어
생각\요청 생각\외관\요청
생각\응답 생각\외관\응답
생각\경로 생각\외관\경로
생각\세션 생각\외관\세션
생각\검증 생각\외관\검증
생각\보기 생각\외관\보기

1. 파사드 클래스

  • 외관은 컨테이너의 (동적) 클래스에 대한 정적 호출 인터페이스를 제공하여 기존의 정적 메서드 호출보다 더 나은 테스트 가능성과 확장성을 제공합니다.
  • 시스템은 대부분의 핵심 클래스 라이브러리에 대해 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();
    }
}

6. 도우미 기능

  • Thinkphp 시스템은 일반적으로 사용되는 일부 작동 방법에 대한 도우미 기능을 캡슐화합니다.
도우미 기능 설명하다
중단하다 실행 중단 및 HTTP 상태 코드 전송
컨테이너에서 신속하게 인스턴스 획득 및 종속성 주입 지원
묶다 빠른 바인딩 개체 인스턴스
은닉처 캐시 관리
class_basename 클래스 이름 가져오기(네임스페이스 없음)
class_uses_recursive 수업에 사용된 모든 특성 가져오기
구성 구성 매개변수 가져오기 및 설정
쿠키 쿠키 관리
다운로드 Get \think\respon\Download 개체 인스턴스
덤프 브라우저 친화적인 변수 출력
환경 환경 변수 가져오기
이벤트 트리거 이벤트
정지 변수 디버그 출력 및 중단 실행
입력 입력 데이터 가져오기는 기본값 및 필터링을 지원합니다.
invoke 调用反射执行callable 支持依赖注入
json JSON数据输出
jsonp JSONP数据输出
lang 获取语言变量值
parse_name 字符串命名风格转换
redirect 重定向输出
request 获取当前Request对象
response 实例化Response对象
session Session管理
token 生成表单令牌输出
trace 记录日志信息
trait_uses_recursive 获取一个trait里所有引用到的trait
url Url生成
validate 实例化验证器
view 渲染模板输出
display 渲染内容输出
xml XML数据输出
app_path 当前应用目录
base_path 应用基础目录
config_path 应用配置目录
public_path web根目录
root_path 应用根目录
runtime_path 应用运行时目录
// 获取输入数据,跟Request::param()效果一样
$param = input();
// 变量调试输出并中断执行
$shop = Db::table('shop_goods')->select();
halt($shop);
// 渲染模板输出,跟View::fetch()效果一样
return view();

七、调试

1、调试模式 和 Trace调试

// 开启调试模式 和 Trace调试
APP_DEBUG = true

备:正式部署后关闭调试模式

2、变量调试

  • ThinPHP内置了 dump 调试方法
$shop = Db::table('shop_goods')->select();
dump($shop);

八、多应用

  • 如果要使用多应用模式,你需要安装多应用模式扩展 think-multi-app
composer require topthink/think-multi-app
www  WEB部署目录(或者子目录)
├─app           应用目录
│  ├─index      项目1
│  │  ├─controller      控制器目录
│  ├  ├─model           模型目录
│  ├  ├─view            视图目录
│  ├─admin      项目2
│  │  ├─controller      控制器目录
│  ├  ├─model           模型目录
│  ├  ├─view            视图目录
│  ├─ ...            更多类库目录
│  │
│  ├─BaseController.php    默认基础控制器类
│  ├─ExceptionHandle.php   应用异常定义文件
│  ├─common.php            全局公共函数文件
│  ├─middleware.php        全局中间件定义文件
│  ├─provider.php          服务提供定义文件
│  ├─Request.php           应用请求对象
│  └─event.php             全局事件定义文件
├─config                配置目录
│  ├─app.php            应用配置
│  ├─cache.php          缓存配置
│  ├─console.php        控制台配置
│  ├─cookie.php         Cookie配置
│  ├─database.php       数据库配置
│  ├─filesystem.php     文件磁盘配置
│  ├─lang.php           多语言配置
│  ├─log.php            日志配置
│  ├─middleware.php     中间件配置
│  ├─route.php          URL和路由配置
│  ├─session.php        Session配置
│  ├─trace.php          Trace配置
│  └─view.php           视图配置
├─view            视图目录
├─route                 路由定义目录
│  ├─route.php          路由定义文件
│  └─ ...
├─public                WEB目录(对外访问目录)
│  ├─index.php          入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于apache的重写
├─extend                扩展类库目录
├─runtime               应用的运行时目录(可写,可定制)
├─vendor                Composer类库目录
├─.example.env          环境变量示例文件
├─composer.json         composer 定义文件
├─LICENSE.txt           授权说明文件
├─README.md             README 文件
└─think                 命令行入口文件

Guess you like

Origin blog.csdn.net/qzmlyshao/article/details/131098107