关于tp5.1部分尝试
前言
尝试一下tp5.1,跟tp5.0有部分区别,就是记录一下
!!! 这是个人笔记,不全,建议只摘抄了部分我觉得重要的,以便以后来看看:
- 更详细的请参考官网:
https://static.kancloud.cn/manual/thinkphp5_1 - 官网不好懂,而且有些地方不详细,建议先看下面这个视频,或者B站什么的搜搜:
https://www.bilibili.com/video/BV17J411K7Zd
一、tp5.1的安装
参考:https://www.kancloud.cn/manual/thinkphp5_1/353948
安装好composer,且只能通过其和git进行下载
输入指令:
composer create-project topthink/think=5.1.* tp5_1
- 1.可能需要换源,如果太慢的话。
- 2.最后的那个"tp5"可以是自定义的。
二、使用步骤
-
利用 phpstudy来作为中间件。
-
已经创建成功。 -
访问:
-
访问 http://localhost/tp5_1/public/
三,tp5的目录结构
- 熟悉的结构:
- - 摘自官网:
www WEB部署目录(或者子目录)
├─application 应用目录
│ ├─common 公共模块目录(可以更改)
│ ├─module_name 模块目录
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录
│ │ └─ ... 更多类库目录
│ │
│ ├─command.php 命令行定义文件
│ ├─common.php 公共函数文件
│ └─tags.php 应用行为扩展定义文件
│
├─config 应用配置目录
│ ├─module_name 模块配置目录
│ │ ├─database.php 数据库配置
│ │ ├─cache 缓存配置
│ │ └─ ...
│ │
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─cookie.php Cookie配置
│ ├─database.php 数据库配置
│ ├─log.php 日志配置
│ ├─session.php Session配置
│ ├─template.php 模板引擎配置
│ └─trace.php Trace配置
│
├─route 路由定义目录
│ ├─route.php 路由定义
│ └─... 更多
│
├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─thinkphp 框架系统目录
│ ├─lang 语言文件目录
│ ├─library 框架类库目录
│ │ ├─think Think类库包目录
│ │ └─traits 系统Trait目录
│ │
│ ├─tpl 系统模板目录
│ ├─base.php 基础定义文件
│ ├─convention.php 框架惯例配置文件
│ ├─helper.php 助手函数文件
│ └─logo.png 框架LOGO文件
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor 第三方类库目录(Composer依赖库)
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
-
在application目录下放置所谓的模块,可以使用多模块模式,也可以使用单一模块,
-
多模块中,可以设置不同的目录,在每个目录下设置MVC三层。可能适合复杂的项目。
-
单模块中,只在application下设置三个MVC文件夹,在每一层中放置不同的php文件,使用单一模块需要在app.php中设置。可能适合简单的项目
-
访问/public目录,
-
可以进入到该框架下的主页, -
将网站的主目录设置为/public可以,防止访问到其他的敏感信息的目录。
进入/public
-
robots.txt用于表明禁止让百度等搜索引擎来搜索的文件,以及文件类型。有些敏感信息的泄露,基于一个网站的robots.txt。这个文件的处理和网站的安全有关。
进入router.php
- 这里测试了一下该文件,即router.php是否为正常的文件。
- php is_file()函数来检测该文件是否正常。
- router.php在public中用于测试作用,测试后并跳转到入口文件。
关于架构
- ThinkPHP支持传统的MVC(Model-View-Controller)模式以及流行的MVVM(Model-View-ViewModel)模式的应用开发,但无论采用何种模式,URL的规范仍然是统一的(官网)。
- tp5.1的URL访问由路由决定,如果在
(1)没有定义或匹配路由的情况下
(2)并且没有开启强制路由模式的话
则是基于:
http://serverName/index.php(或者其它入口文件)/模块/控制器/操作/参数/值…
控制器
控制器文件通常放在application/module/controller下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。
-
为了更方便使用,控制器类建议继承系统的控制器基类think\Controller,虽然无需继承也可以使用。(可继承)
-
控制器类文件的实际位置是
www\tp5_1\application\index\controller\Index.php
- 没有自定义路由的情况下,可以通过访问如下路由:
http://localhost/tp5_1/public/index.php/index
- 此时注意下图中,后面这一片
…/模块/控制器/操作/参数/值… - 模块指的是—》application进去后的第一个index文件夹,控制器也就是放在applacation/index中。这个文件夹是index,所以可以在/public/index中访问到:
- 控制器也就是里面的controller,也是index,再加上index,仍然可以访问
- 还有一个操作,也就是方法,可以查看给好的初始文件:public/applacation/index/controller/index.php
也就是其首页文件:
- Index是其主类,必须和index.php前面的index一样,可以小写,但是tp的命名规范要求首字母大写
- 类中存在这两个函数,是官方默认给出的。等于再访问一个index可以访问到index方法:
- 这也是网址中可以出现四个index的原因,这是官方默认的,可以自行更改。
- index函数/方法。可以被访问到,那他下面的hello方法也可以被访问:
- 自定义一个也是可以的:
- 传参:
- 上面的hello函数,定义了一个$name传参,默认为“ThinkPHP5”,这里对方法的传参依旧基于官方给出的例子:
- 操作也就是方法,在这里是’hello’函数,如果要传参的话,需要以 /操作/参数/值 的形式,也就是:
../hello/name/值
模型和数据库
然后就是tp5的model模块,model模块可以操纵数据库
-
在 /config/database.php中找到配置文件
-
在此时,开始使用jetbrain的phpstorm,编写php更加方便
-
在application下创建一个mysql文件夹作为模块,再在mysql中创建controller,和Database.php
database.php 如下:
-
phpstorm输入Db时会自动加载相关的模块,也就是use think/Db
-
Db::name()中写入数据库的表名
数据库如下:
访问指定的路由:
成功,从数据库中读取出所有的数据。 -
Db::table(),Db::name()有区别
-
然后是,创建Model层,MVC中的Model一般是为了数据库交互设计的层
在application下创建一个model文件,在其下创建一个Test.php,主类为Test,这个名字必须与数据库中的该表名一样。也就是说数据库中的表为test.
- 要继承model类:
然后在之前的database.php中新增一个函数:
直接写Test::select():
访问效果是一样的:
- 然后是数据库的基本操作,CRUD,tp5的一系列操作按照官网的说法:
增加数据
插入一条数据
按照官网:
直接实例化Model类,并直接赋值:
然后访问:
- 或者在实例化的时候直接传入:
- 并且在保存之后可以获取自增ID:
插入多条数据
使用saveAll函数:
- 存在主键时,会认为是更新操作,所以,可以对于有主键的操作,可以在后面再加一个参数false.
更简单的新增方法
利用自带的insert函数:
- 也有insertAll等方法,操作类似,更改主键等也类似:
- 可以Ctrl点进Db类,去看看有哪些函数
删除数据
最常用的按照条件删除
Test::Where('id','=','3')->delete();
按照主键删除
根据模型删除
- 根据模型删除,会删除模型的事件处理
$user = User::get(1);
$user->delete();
更新
查找并更新
- 利用查找和save()函数,来更改
$test = Test::get(1);
$test->name = 'thinkphp';
$test->email = 'thinkphp@qq.com';
$test->save();
- 或者利用update()来更改,语法比较简单,需要where函数来按照条件更新
Db::name('test')->where('id','2')->update(['name'=>'已改']);
获取单个数据
// 取出主键为1的数据
$test = Test::get(1);
echo $test->name;
// 使用查询构造器查询满足条件的数据
$test = Test::where('name', 'thinkphp')->find();
echo $test->name;
获取多个数据
// 根据主键获取多个数据
$list = Test::all('1,2,3');
// 或者使用数组
$list = Test::all([1,2,3]);
// 对数据集进行遍历操作
foreach($list as $key=>$test){
echo $test->name;
}
其他的参考官网,这些是主要的。
其他
- inc() 和 dec()可以对字段增值或减值
//自增1
Db::name('test')->where('id','123')->setInc('id',1);
//自减1
Db::name('test')->where('id','123')->setDec('id',1);
视图
视图渲染:
模板渲染:
<?php
namespace app\index\controller;
use think\Controller;
//必须继承Controller才能用原生的fetch()方法
class Index extends Controller
{
public function index()
{
// 不带任何参数 自动定位当前操作的模板文件
return $this->fetch();
}
}
- 或者说明需要访问的模板名称,及html文件的前缀,像thymeleaf模板引擎用法?
- 并自动寻找该模块下view中的同名html,貌似官网说需要在view文件夹下再创建一个与模块同名的文件夹,比如这里就是index.
访问:
视图赋值
这一片在官网的模板一节有,
直接用官网的示例:
利用assign()函数向前端传值:
- 进入前端的index.html网页写上:
- 用 {@xxx} 这种形式传递变量,也可以将数据库的信息传到前端,
- 模板中的html文件在访问时,会被编译成php文件,所以在html文件中写上php代码,在访问控制器时依旧可以使用。
- 编译好的php文件保存在runtime/temp目录下,可以去看看:
也可以清楚地看到其转换的形式。
- 网站以php为后台时,可以在html文件中嵌入php代码,但执行的条件是,必须在php文件中调用,同时又不能让用户直接访问到html文件,thinkphp的模块化管理说不定对文件的安全访问有一定帮助。