【Thinkphp 6】框架基础知识

news2024/11/16 0:17:42

文章目录

  • 环境搭建
  • 框架基础规则
    • 继承引入
    • 单应用模式
    • 多应用模式
    • 自定义路由
    • 调试器
    • 空控制器
  • 视图
    • 模板引擎安装
    • 渲染模板
    • facade代理
    • 变量传递
      • view.php
      • 语法
      • 查看编译后的文件
      • 默认值
      • 数组按键取值
      • md5加密
  • 请求
    • request信息
    • 参数接收
    • 生成URL
  • 文件上传
    • 上传及验证
  • 验证功能
    • 验证器
    • 表单令牌
  • 中间件
  • 杂项
    • session
    • Cookie

环境搭建

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer create-project topthink/think tp
php think run

框架基础规则

继承引入

use app\BaseController;

class coleak extends BaseController

use进行引入,然后继承基础的方法

单应用模式

入口文件(index.php)可以省略

在这里插入图片描述

http://localhost:8000/coleak/test
http://localhost:8000/index.php/coleak/test

多应用模式

composer require topthink/think-multi-app

在app里新建文件夹,并将相应的控制器(controller)放到新建的文件夹下

遵守类名和文件名一致,空间名和文件夹名一致

在这里插入图片描述

namespace app\cc\controller;
http://localhost:8000/cc/coleak/test

自定义路由

http://localhost:8000/coleak/hello/a

调试器

重命名为 .env

    public function c()
    {
        $arr=['id'=>1,"name"=>"coleak"];
        $name='coleak';

//        return "666".'21a1';

//        return json($arr);

//        dump($arr);
//        dump($name);

//        halt终止程序并输出dunp
//        halt($arr);
//        halt($name);
//
//        trace调试器中输出
        trace($arr);
        trace($name);
//        dump($ar);
    }

空控制器

在controller下面定义个Error.php

<?php
namespace app\cc\controller;
class Error{
    public function __call($name, $arguments)
    {
        // TODO: Implement __call() method.
        return "Error Requests!";
    }
}

视图

模板引擎安装

composer require topthink/think-view

看下composer.json

    "require": {
        "php": ">=7.2.5",
        "topthink/framework": "^6.1.0",
        "topthink/think-orm": "^2.0",
        "topthink/think-filesystem": "^1.0",
        "topthink/think-multi-app": "^1.0",
        "topthink/think-view": "^1.0"
    },

渲染模板

    public function t()
    {
        return view(1);
    }
//如果html文件名和方法名一致,即为t.html。则无需参数
    public function t()
    {
        return view();
    }

在这里插入图片描述

facade代理

use think\facade\View;
    public function t()
    {
//        return view();
        return View::fetch();
    }
//或者直接使用(不推荐)
return \think\facade\View::fetch();

当方法使用驼峰命名法是,如testColeak,则对应的html文件应该为test_coleak

在这里插入图片描述

变量传递

view.php

    'tpl_begin'     => '{',
    // 模板引擎普通标签结束标记
    'tpl_end'       => '}',
    // 标签库标签开始标记
    'taglib_begin'  => '{',
    // 标签库标签结束标记
    'taglib_end'    => '}',

语法

    public function testColeak(){
        View::assign("name","coleak");
        View::assign("age",19);
        return View::fetch();
    }
    
{$name}
{$age}

查看编译后的文件

在runtime/cc/temp

发现进行了一个htmlentities处理,不让html标签解析,进行原样显示

在这里插入图片描述

让其解析则加一个|raw

{$name}
<br>
{$name|raw}

View::assign("name","<h1>coleak</h1>");

<?php echo htmlentities($name); ?>
<br>
<?php echo $name; ?>

默认值

{$a|default="coleak"}

数组按键取值

$arr=["name"=>"coleak","age"=>19];
View::assign("arr",$arr);
        
{$arr["name"]}-{$arr.age}

md5加密

{$arr["name"]|md5}-{:md5($arr.name)}

请求

request信息

 //http://127.0.0.1:8000/cc/c/test  
public function test()
    {
//        dump(Request::method());
        dump($this->request->method());
        dump($this->request->ip());
        dump($this->request->host());
        dump($this->request->scheme());
        dump($this->request->url());
        dump($this->request->root());
        dump($this->request->baseUrl());
    }
^ "GET"
^ "127.0.0.1"
^ "127.0.0.1:8000"
^ "http"
^ "/cc/c/test"
^ "/cc"
^ "/cc/c/test"

参数接收

//http://127.0.0.1:8000/cc/c/server/b/2?a=45
    public function server()
    {
        dump($this->request->get());
        //pathinfo传参
//      /参数名1/参数值1/参数名2/参数值2...
        dump($this->request->route());
        //通用的
        dump($this->request->param());
    }

^ array:1 [▼
“a” => “45”
]
^ array:1 [▼
“b” => “2”
]
^ array:2 [▼
“a” => “45”
“b” => “2”
]

生成URL

    public function url()
    {
        echo Route::buildUrl();
        echo "<br>";
        echo Route::buildUrl("coleak/testColeak",["name"=>"coleak","age"=>19]);
        echo "<br>";
        echo Route::buildUrl("coleak/testColeak",["name"=>"coleak","age"=>19])
        ->domain("www.baidu.com")
        ->suffix("phtml");
        echo "<br>";
        echo url("coleak/testColeak",["name"=>"coleak","age"=>19]);
    }
/cc/C/url.html
/cc/coleak/testColeak.html?name=coleak&age=19
http://www.baidu.com/cc/coleak/testColeak.phtml?name=coleak&age=19
/cc/coleak/testColeak.html?name=coleak&age=19

文件上传

上传及验证

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<form action="" enctype="multipart/form-data" method="post">
    file:<input type="file" name="image">
    <br>
    <button>提交</button>
<!--    <input type="submit" value="upload">-->
</form>
</body>
</html>
<?php
namespace app\cc\controller;
use app\BaseController;
use think\facade\View;
use think\facade\Filesystem;

class Upload extends BaseController{
    public function upload(){
        if ($this->request->isPost())
        {
//            $file=$this->request->file("image");
//            dump($file);
            $file=$this->request->file();
            dump($file);
            $size=1000*1024;
            validate(["image"=>"image|fileSize:{$size}|fileExt:jpg"])
            ->check($file);
            $savefile=Filesystem::disk("public")->putfile("uploads",$file["image"]);
            dump($savefile);
            echo "successed";
        }else{
            return View::fetch();
        }
    }
}

验证功能

验证器

<?php
namespace app\validate;
use think\Validate;

class Student extends Validate{
    protected $rule=[
        'name'=>"require|chs|length:2,15",
        "age"=>'require|number|between:18,60'
    ];
    protected $message=[
      'name.require'=>"姓名为空",
        'age.require'=>"年龄为空",
        'name.chs'=>"姓名不为汉字",
        'name.length'=>"姓名长度错误",
        'age.number'=>"年龄不为数字",
        'age.between'=>"年龄不符合范围",
    ];
}
 public function add(){
        $arr1=["name"=>"coleakxiao","age"=>19];
        $arr2=["name"=>"小1","age"=>19];
        $arr3=["name"=>"小","age"=>11];
        $arr4=["name"=>"小小小","age"=>22];
        $stu=new Student();
//        if(!$stu->check($arr1))
//        {
//            echo $stu->getError().PHP_EOL;
//        }
//        if(!$stu->check($arr4))
//        {
//            echo $stu->getError().PHP_EOL;
//        }
//        echo "successed".PHP_EOL;

//        validate(Student::class)->check($arr4);
//        validate(Student::class)->check($arr1);//验证失败会抛出异常

        //匿名函数形式验证方式
        validate(
            ['name'=>"require|chs|length:2,15"],
            ['name.require'=>"姓名为空", 'name.chs'=>"姓名不为汉字", 'name.length'=>"姓名长度错误",]
        )->check($arr4);
//scene定义场景验证,function自定义接口验证
        try {
//            echo $aaa;
            validate(Student::class)->check($arr4);
            validate(Student::class)->check($arr1);
        }catch(ValidateException $e)
        {
            echo $e->getMessage();
        }
        catch (\Exception $e)//两次捕获不同的异常,验证异常放在普通的异常捕获前面
        {
            echo $e->getMessage();
        }
    }

表单令牌

public function form(){
        if($this->request->isPost() and $this->request->checkToken("__token__"))
        {
//            $r1=$this->request->checkToken("__token__");
//            dump($r1);
            //或者直接在验证器里面设置 'name'=>"require|chs|length:2,15|token:__token__"
            dump($this->request->param());
        }
        else {
            return View::fetch();
        }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">

    <input type="hidden" name="__token__" value="{:token()}" />
  name:<input type="text" name="user">
    <br>
  <br>
  <button>提交</button>
</form>
</body>
</html>

中间件

php think make:middleware Check

middleware.php中修改
\app\middleware\Check::class
    
        public function handle($request, \Closure $next)
    {
        dump(111);
//        if ($request->param())
    return $next($request);
    }

杂项

session

开启session中间件 \think\middleware\SessionInit::class

class coleak extends BaseController
	{
    public function ss1(){
        Session::set("name","coleak");
        $arr=["name"=>"coleak1","age"=>19,"sex"=>"男"];
        Session::set("arr",$arr);
    }
    public function ss2()
    {
        dump(Session::get("arr"));
        Session::delete("name");
        dump(Session::has("name"));
        dump(Session::all());
        Session::clear();
        dump(Session::all());
    }

在config/session.php配置session相关的属性

Cookie

    public function ss3()
    {
        Cookie::set("name","ayuexiao",3600);
        dump(Cookie::get("name"));
        Cookie::delete("name");
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/465284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android不可不知调试技巧

目录 1、条件断点 2、评估表达式&#xff08;Evaluate Expression&#xff09; 3、日志断点 4、方法断点 5、异常断点 6、Field WatchPoint 1、条件断点 假设我们列表循环的某个元素时候才暂停&#xff0c;就用这种方式。具体方式在循环列表打断点&#xff0c;对着断点右…

Nginx简介和快速入门

前言: 在一个小型的个人博客网站中&#xff0c;因为没什么流量&#xff0c;并发量小&#xff0c;一般可以直接在一个服务器上的tomcat中直接运行jar包.由tomcat直接响应给客户。 到后面之后随着流量的增大&#xff0c;一台服务器的资源不够用了&#xff0c;此时就需要再多开一…

浏览器渲染页面的原理及流程

1、渲染引擎首先通过网络获得所请求文档的内容 2、解析HTML文件&#xff0c;构建 DOM Tree 3、解析CSS&#xff0c;构建 CSSOM Tree(CSS规则树) 4、将 DOM Tree 和 CSSOM Tree合并&#xff0c;构建Render tree(渲染树) 5、reflow(重排、回流)&#xff1a;根据Render tree进行节…

功率器件的仿真评估

功率器件的仿真评估 1.功率器件仿真评估概述2.IGBT温升模型整理3.Matlab仿真计算4.仿真评估报告 1.功率器件仿真评估概述 功率器件的仿真评估共五个步骤&#xff1a; a.根据IGBT数据手册整理中热阻参数、开关损耗参数温升模型&#xff1b; b.带入到Matlab中仿真堵转、中速运行…

一键免费部署你的私人 ChatGPT 网页应用

主要功能 在 1 分钟内使用 Vercel &#xff08;https://vercel.com/&#xff09;免费一键部署精心设计的 UI&#xff0c;响应式设计&#xff0c;支持深色模式极快的首屏加载速度&#xff08;~100kb&#xff09;海量的内置 prompt 列表&#xff0c;来自中文和英文自动压缩上下文…

CUDA下载,以及下载GPU版本的pytorch

一、下载anaconda 因为这步我之前就下好了&#xff0c;主要参考这个链接&#xff1a;史上最全最详细的Anaconda安装教程 二、下载CUDA 1.首先观察自己需要什么版本的CUDA&#xff0c;以及是否安装过CUDA 先cmd&#xff0c;输入命令 nvidia-smi结果如下&#xff0c;所以我们…

论文笔记:Hidden Markov Map MatchingThrough Noise and Sparseness

sigspatial 2009 1 方法介绍 1.0great circle和route距离 1.1 和ST-matching的比较 1.1.1 转移概率和观测概率 和同一年的ST-matching很类似&#xff0c;也是使用HMM来进行路网匹配论文笔记&#xff1a;Map-Matching for low-sampling-rate GPS trajectories&#xff08;ST…

【Redis7】Spring Boot集成Redis(重点:集成RedisTemplate)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 Spring Boot集成Redis&#xff0c;包括Jedis、lettuce、集成RedisTemplate、集群时一台master宕机&#xff0c;java报错的情况分析。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文…

linux-02-软件安装-centos7配置jdk、tomcat、mysql、lrzsz、项目部署(Git、Maven)、shell脚本自动从git仓库获取项目更新★

文章目录 Linux-Day02课程内容1. 软件安装1.1 软件安装方式1.2 安装JDKshell脚本里写 cd命令不生效 1.3 安装Tomcat1.3.1 Tomcat安装好多方便的自定义命令:1.3.2 Tomcat进程查看1.3.3 防火墙操作1.3.4 停止Tomcat 1.4 安装MySQL1.4.1 MySQL安装1.4.2 MySQL启动1.4.3 MySQL登录1…

几何算法——7.Blending(倒角)的调研、设计及算法

几何算法——7.Blending&#xff08;倒角&#xff09;的调研、设计及算法 1 Parasolid的Blending1.1 关于Parasolid的BlendSurface1.2 Edge Blending1.2.1 Rolling-ball blends1.2.2 Variable rolling-ball blends1.2.3 Chamfers1.2.3.1 face offset chamfers1.2.3.2 apex-rang…

自学黑客/网络渗透,一般人我劝你还是算了

写在开篇 笔者本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全实验室。 我为啥说自学黑客&#xff0c;一般人我还是劝你算了吧。因为我就是那个不一般的人。 首先我谈下对黑客&…

AMBA总线协议AXI——学习笔记

文章目录 前言一、AXI&#xff08;Advanced eXtensible Interface&#xff09;1、定义2、信号2.1 全局信号2.2 写数据通路2.3 写地址通道2.4 写回复通道2.5 读数据通道2.6 读地址通道2.7 低功耗接口信号 3、AXI-Lite协议特点4、读写时序图4.1 读burst4.2 读重叠burst4.3 写burs…

Baklib母公司探码科技荣获甲子光年:2023中国AI数据平台创新企业

4月25日&#xff0c;由中国科技产业智库「甲子光年」主办、上海市信息服务业行业协会支持的「共赴山海2023甲子引力X智能新世代」峰会在上海召开。峰会上为了表彰在AI领域中取得卓越成就的公司&#xff0c;甲子光年在峰会现场颁布了星辰20&#xff1a;创新企业&#xff0c;表彰…

鹏程·盘古

鹏程盘古模型基于 1.1 TB 高质量中文训练数据&#xff0c;采用全场景人工智能计算框架 MindSpore 自动并行技术实现了五维并行训练策略&#xff0c;从而可将训练任务高效扩展到 4 096 个处理器上。 对比实验表明&#xff0c;在少样本或零样本情况下&#xff0c;鹏程盘古模型在…

Mysql高级知识-------索引

mysql索引的创建&#xff0c;新增&#xff0c;删除 查询索引&#xff1a; 语法&#xff1a; show index from 表 主要参数&#xff1a; 新建表中添加索引 ① 普通索引 create table t_dept( no int not null primary key, name varchar(20) null, sex varchar(2) null, inf…

讯飞星火大模型申请及测试:诚意满满

“ 大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加&#xff1a;keeepdance&#xff0c;备注&#xff1a;chatgpt&#xff0c;拉你进群。 最近国产大模型跟下饺子似&#xff0c;隔几天就发布一个。厂家发布得起劲&#xf…

ArduPilot之posHoldRTL实测

ArduPilot之posHold&RTL实测 1. 源由2. 模式配置3. 测试步骤4. 飞行实测5. 总结6. 参考资料7. 附录-关于QGC 暂不支持MAVLink2 signing Protocol问题7.1 问题描述7.2 硬件配置7.3 逻辑分析7.4 配置Signature7.5 总结&#xff08;QGC目前尚不支持MAVLink2 Signature&#xf…

算法——分布式——一致性哈希、一致性hash图解动画

分布式算法——一致性哈希、一致性Hash 概述传统Hash算法算法步骤生成Hash环定位服务器定位数据和映射服务器 服务器变更Hash环倾斜虚拟节点总结 概述 一致性哈希算法在1997年由麻省理工学院提出&#xff0c;是一种特殊的哈希算法&#xff0c;目的是解决分布式缓存的问题。在移…

使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))

1、环境 python 3.7.12 tensorflow 1.15 keras 2.3.1 bert4keras 0.9.7 protobuf 3.19.0 numpy 1.16.5 2、出现问题 numpy版本不兼容问题所以你就直接按照我的版本就可以了&#xff08;numpy 1.16.5&#xff09; Process finished with exit code -1073741819 (0xC0000005) …

关于储存器的笔记

存储器是许多存储单元的集合&#xff0c;按单元号顺序排列。每个单元由若干二进制位构成&#xff0c;以表示存储单元中存放的数值&#xff0c;通常由数组描述存储器。 存储器可分为主存储器(简称主存或内存)和辅助存储器(简称辅存或外存)两大类。和CPU直接交换信息的是主存。 …