기사
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">密 码</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 命令行入口文件