tp5.0的学习笔记

版权声明:版权归作者所有 https://blog.csdn.net/qq_36772866/article/details/84947434

项目目录

tp5

├─application     应用目录

├─extend          扩展类库目录(可定义)

├─public          网站对外访问目录

├─runtime         运行时目录(可定义)

├─vendor          第三方类库目录(Composer)

├─thinkphp        框架核心目录

├─build.php       自动生成定义文件(参考)

├─composer.json   Composer定义文件

├─LICENSE.txt     授权说明文件

├─README.md       README 文件

├─think           命令行工具入口

TP-四种url访问的方式

url的4种访问方式 (这是重点!!)

1.PATHINFO 模式 --重点 在后面使用非常多,如果想传多个参数可以使用键1/值1/键2/值2方法

代码如下:

http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2

2.普通模式也称为重写模式

代码如下:

http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2

3.REWRITE重写模式,去掉入口文件便于SEO优化

代码如下:

http://域名/项目名/模块名/方法名/键1/值1/键2/值2

4.兼容模式

代码如下:

http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2

如何修改PATHINFO地址中的/改成-在Home/Conf/config.php中

代码如下:

'URL_PATHINFO_DEPR'=>'-',//修改RUL的分隔符,把地址栏的参数部分/换成:http://域名/项目名/入口文件/模块名-方法名-键1-值1-键2-值2

在index.php中开启调用模式,为了在后产模式中不让文件缓存影响开发

代码如下:

define('APP_DEBUG',ture);//如果设置为ture不缓存文件,false则缓存文件

REWRITE模式开启方法

在httpd.conf中查找rewrite_module modules/mod_rewrite.sl 把#去掉重启服务,在入口文件下新建.htaccess.php,重写文件是去掉index.php的意思:

代码如下:

RewriteEngine on  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

路由处理过程大概如下:

1.遍历路由规则rule,与当前PATHINFO字符串进行匹配,如果合法,则从PATHINFO中取出所需要的字符串。

2.路由中每条规则对应一个router,router中指定对应的模块以及方法,模块和方法可以用第1步中匹配到的字符串进行动态替代。

3.将剩余的参数都解析并写入到$_GET中。

接口调试软件网址

http://www.36nu.com/apiTest

项目目录

目录	        说明	        常量

tp5	        项目根目录	ROOT_PATH

tp5/application	应用目录	APP_PATH

tp5/thinkphp	框架核心目录	THINK_PATH

tp5/extend	应用扩展目录	EXTEND_PATH

tp5/vendor	Composer扩展目录	VENDOR_PATH
5.1版本取消了所有的系统常量,改为环境变量获取
获取方式为: think\facade\Env::get('环境变量名')

目录	说明	环境变量
tp5	项目根目录	root_path
tp5/application	应用目录	app_path
tp5/thinkphp	框架核心目录	think_path
tp5/extend	应用扩展目录	extend_path
tp5/vendor	Composer扩展目录	vendor_path

核心框架目录的结构如下

├─thinkphp 框架系统目录
│  ├─lang               语言包目录
│  ├─library            框架核心类库目录
│  │  ├─think           think 类库包目录
│  │  └─traits          系统 traits 目录
│  ├─tpl                系统模板目录
│  │
│  ├─.htaccess          用于 apache 的重写
│  ├─.travis.yml        CI 定义文件
│  ├─base.php           框架基础文件
│  ├─composer.json      composer 定义文件
│  ├─console.php        控制台入口文件
│  ├─convention.php     惯例配置文件
│  ├─helper.php         助手函数文件(可选)
│  ├─LICENSE.txt        授权说明文件
│  ├─phpunit.xml        单元测试配置文件
│  ├─README.md          README 文件
│  └─start.php          框架引导文件

$this->request->param()

获取请求参数
https://blog.csdn.net/u012600104/article/details/78845325

启动服务

在开始之前,你需要一个Web服务器和**PHP5.4+**运行环境,如果你暂时还没有,我们推荐使用集成开发环境WAMPServer(Windows系统下集成Apache、PHP和MySQL的服务套件)来使用ThinkPHP进行本地开发和测试,最新版本的WAMP在这里下载。

如果你不想安装任何WEB服务器,也可以直接使用PHP自带的WebServer,并且运行router.php来运行测试。

我们进入命令行,进入tp5/public目录后,输入如下命令:

php -S localhost:8888 router.php

伪静态引擎

<IfModule mod_rewrite.c> 
    Options +FollowSymlinks -Multiviews 
    RewriteEngine on #开启rewrite引擎
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] 
</IfModule>

入口文件

├─application           应用目录(可设置)
│  ├─index              模块目录(可更改)
│  │  ├─config.php      模块配置文件
│  │  ├─common.php      模块公共文件
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  └─view            视图目录
│  │
│  ├─command.php        命令行工具配置文件
│  ├─common.php         应用公共文件
│  ├─config.php         应用配置文件
│  ├─tags.php           应用行为扩展定义文件
│  ├─database.php       数据库配置文件
│  └─route.php          路由配置文件

生成demo

php think build --module demo


├─demo   
│  ├─controller      控制器目录
│  ├─model           模型目录
│  ├─view            视图目录
│  ├─config.php      模块配置文件
│  └─common.php      模块公共文件

控制器名字命名

如果是HelloWorld这种控制名字的话,
在连接访问的时候
需要这样访问
http://ken.tp5.com/index/hello_world/index

返回json格式

$data = ["name"=>"Ken","age"=>20,"sex"=>"man"];
<!-- 返回json,并修改状态码 -->
return json($data,201);
<!-- 返回json数据 -->
return json($data);
<!-- 返回xml -->
return xml($data);  
 <!--渲染模板  -->
$this->assign("name","莫纳个");
return $this->fetch('index/index2');   

模块

模块下面有控制器模块
也有模板模块

正确跳转到正确的页面

$this->success("正确的页面","index");
就会跳转到index页面

错误的跳转页面

function errored(){
    $this->error("错误页面","index");
}

资源访问

public
├─index.php       应用入口文件
├─static				静态资源目录   
│  ├─css      样式目录
│  ├─js         脚本目录
│  └─img      图像目录

记住,千万不要在public目录之外的任何位置放置资源文件,包括application目录。

http://tp5.com/static/css/style.css
http://tp5.com/static/js/common.js
http://tp5.com/static/img/picture.jpg

引入请求对象

https://blog.csdn.net/weixin_41452768/article/details/79679510
use think\Request;

TP5.1:request请求对象(使用四种方式获取)

在index/controller下创建一个名为requests.php的文件
(注意:不要起名为request,因为它是关键字,不被允许起名)

动态方法和静态方法的区别:

静态方法:public  static  function  test(){}

动态方法:;public  function  test(){}

可以看出,他们的区别就是一个是静态方法,一个是普通方法。
use think\Request;

class Name

{

    $request = Request::instance();

    $method = $request->method();//获取上传方式

    $request->param();//获取所有参数,最全

    $get = $request->get();获取get上传的内容

    $post = $request->post();获取post上传的内容

    $request->file('file')获取文件

}
--------------------- 
作者:weixin_41452768 
来源:CSDN 
原文:https://blog.csdn.net/weixin_41452768/article/details/79679510 
版权声明:本文为博主原创文章,转载请附上博文链接!

获取URL信息

$request = Request::instance();
// 获取当前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo 'file: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root:' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo 'pathinfo: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo 'ext: ' . $request->ext() . '<br/>';

请求参数获取

echo '请求方法:' . $request->method() . '<br/>';
echo '资源类型:' . $request->type() . '<br/>';
echo '访问ip地址:' . $request->ip() . '<br/>';
echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>';
echo '请求参数:';
dump($request->param());
echo '请求参数:仅包含name';
dump($request->only(['name']));
echo '请求参数:排除name';
dump($request->except(['name']));

配置sql调试工具箱

https://my.oschina.net/lylyg/blog/1486895
https://blog.csdn.net/qq_40657528/article/details/82596488
https://blog.csdn.net/u012600104/article/details/78833789

微信公众号开发

https://my.oschina.net/lylyg/blog/1486895
https://blog.csdn.net/feverrun/article/details/78857834
https://www.cnblogs.com/zzcit/p/5573708.html
https://www.cnblogs.com/xp796/p/5215500.html
https://www.cnblogs.com/zsczsc/p/6577224.html

微信开发视频教程

https://www.imooc.com/video/9304

msql预处理语句

https://blog.csdn.net/weixin_37839711/article/details/81562550

查询数据

查询一个数据使用:

// table方法必须指定完整的数据表名
Db::table('think_user')->where('id',1)->find();
find 方法查询结果不存在,返回 null

查询数据集使用:

Db::table('think_user')->where('status',1)->select();
select 方法查询结果不存在,返回空数组

如果设置了数据表前缀参数的话,可以使用

Db::name('user')->where('id',1)->find();
Db::name('user')->where('status',1)->select();
如果你的数据表没有使用表前缀功能,那么name和table方法的一样的效果。

在find和select方法之前可以使用所有的链式操作方法。

默认情况下,find和select方法返回的都是数组。

主从查询
如果你使用了分布式数据库,那么默认情况下查询操作都是在从数据库中进行,如果你在一些特殊的情况下需要从主库读取数据,可以使用:

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
Db::name('user')->master()->where('id',1)->find();
V5.0.19+版本开始,支持一旦某个表写入了数据,那么当前请求的后续查询操作都可以自动从主库读取。

你需要在数据库配置文件中增加下面的配置参数:

// 从主库读取数据
'read_master'	=>	true,
如果你只需要对某个表进行操作,可以使用readMaster方法。

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
	->readMaster()
    ->insert($data);
// 后续所有关于该数据表的查询都会走主库
也可以让后续所有数据表的查询都走主库

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
	->readMaster(true)
    ->insert($data);
// 后续所有数据表的查询都会走主库
助手函数
系统提供了一个db助手函数,可以更方便的查询:

db('user')->where('id',1)->find();
db('user')->where('status',1)->select();
注意:使用db助手函数默认每次都会重新连接数据库,而使用Db::name或者Db::table方法的话都是单例的。db函数如果需要采用相同的链接,可以传入第三个参数,例如:

db('user',[],false)->where('id',1)->find();
db('user',[],false)->where('status',1)->select();
上面的方式会使用同一个数据库连接,第二个参数为数据库的连接参数,留空表示采用数据库配置文件的配置。

版本 调整功能
5.0.9 db助手函数默认不再强制重新连接
使用Query对象或闭包查询
或者使用查询对象进行查询,例如:

$query = new \think\db\Query();
$query->table('think_user')->where('status',1);
Db::find($query);
Db::select($query);

或者直接使用闭包函数查询,例如:

Db::select(function($query){
    $query->table('think_user')->where('status',1);
});

值和列查询
查询某个字段的值可以用

// 返回某个字段的值
Db::table('think_user')->where('id',1)->value('name');
value 方法查询结果不存在,返回 null

查询某一列的值可以用

// 返回数组
Db::table('think_user')->where('status',1)->column('name');
// 指定索引
Db::table('think_user')->where('status',1)->column('name','id');
Db::table('think_user')->where('status',1)->column('id,name'); // 同tp3的getField
column 方法查询结果不存在,返回空数组

数据集分批处理
如果你需要处理成千上百条数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用。

比如,我们可以全部用户表数据进行分批处理,每次处理 100 个用户记录:

Db::table('think_user')->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});

// 或者交给回调方法myUserIterator处理

Db::table('think_user')->chunk(100, 'myUserIterator');
你可以通过从闭包函数中返回false来中止对数据集的处理:

Db::table('think_user')->chunk(100, function($users) {
    // 处理结果集...
    return false;
});

也支持在chunk方法之前调用其它的查询方法,例如:

Db::table('think_user')->where('score','>',80)->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});

chunk方法的处理默认是根据主键查询,支持指定字段,例如:

Db::table('think_user')->chunk(100, function($users) {
    // 处理结果集...
    return false;
},'create_time');

V5.0.11版本开始,chunk方法支持指定处理数据的顺序。

Db::table('think_user')->chunk(100, function($users) {
    // 处理结果集...
    return false;
},'create_time', 'desc');
JSON类型数据查询(mysql V5.0.1)
// 查询JSON类型字段 (info字段为json类型)
Db::table('think_user')->where('info$.email','[email protected]')->find();

添加一条数据

使用 Db 类的 insert 方法向数据库提交数据

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
如果你在database.php配置文件中配置了数据库前缀(prefix),那么可以直接使用 Db 类的 name 方法提交数据

Db::name('user')->insert($data);
insert 方法添加数据成功返回添加成功的条数,insert 正常情况返回 1

添加数据后如果需要返回新增数据的自增主键,可以使用getLastInsID方法:

Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();
或者直接使用insertGetId方法新增数据并返回主键值:

Db::name('user')->insertGetId($data);
insertGetId 方法添加数据成功返回添加数据的自增主键

添加多条数据

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);
助手函数
// 添加单条数据
db('user')->insert($data);

// 添加多条数据
db('user')->insertAll($list);
快捷更新
V5.0.5+以上版本封装的快捷更新方法data,可以配合insert使用。

下面举个例子说明用法:

Db::table('data')
    ->data(['name'=>'tp','score'=>1000])
    ->insert();

猜你喜欢

转载自blog.csdn.net/qq_36772866/article/details/84947434