Thinkphp5学习笔记
Thinkphp5学习笔记
架构
Thinkphp5目录架构
thinkphp 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ├─index 模块目录(可更改) │ │ ├─config.php 模块配置文件 │ │ ├─common.php 模块函数文件 │ │ ├─controller 控制器目录 │ │ ├─model 模型目录 │ │ ├─view 视图目录 │ │ └─ ... 更多类库目录 │ ├─command.php 命令行工具配置文件 │ ├─common.php 应用公共(函数)文件 │ ├─config.php 应用(公共)配置文件 │ ├─database.php 数据库配置文件 │ ├─tags.php 应用行为扩展定义文件 │ └─route.php 路由配置文件 ├─extend 扩展类库目录(可定义) ├─public WEB 部署目录(对外访问目录) │ ├─static 静态资源存放目录(css,js,image) │ ├─index.php 应用入口文件 │ ├─router.php 快速测试文件 │ └─.htaccess 用于 apache 的重写 ├─runtime 应用的运行时目录(可写,可设置) ├─vendor 第三方类库目录(Composer) ├─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 框架引导文件 ├─build.php 自动生成定义文件(参考) ├─composer.json composer 定义文件 ├─LICENSE.txt 授权说明文件 ├─README.md README 文件 ├─think 命令行入口文件
规范
ThinkPHP5.0的URl访问受路由决定,如果关闭路由或者没有匹配路由的情况下,则是基于:
http://serverName/index.php(或者其他应用入口文件,可省略) /模块/ 控制器/操作 / 参数 /值
在Thinkphp5.0框架中,在url地址栏里面如果不写模块、控制器和操作名,默认访问的就是index模块下面的index控制器下面的index操作,可以在config.php文件中进行修改。
入口文件
用户请求的PHP文件,负责处理一个请求(注意,不一定是URL请求)的生命周期,最常见的入口文件就是index.php, 有时候也会为了某些特殊的需求而增加新的入口文件,例如给后台模块单独设置的一个入口文件admin.php或者一个控制器程序入口think都属于入口文件。
命名空间规范
应用类库的根命名空间统一为app(可以设置app_namespace配置参数更改); 例如:app\index\controller\Index 和 app\index\model\User;
属性命名
- 类的命名采用驼峰法,并且首字母大写,例如User、UserType,默认不需要添加后缀,例如UserController应该直接命名为User;
- 在Thinkphp3中需要UserController等命名方式;
- 函数的命名使用小写和下划线(小写字母开头的方式),例如get_client_ip ;
- 方法的命名使用驼峰法,并且首字母小写,例如getUserName ;
- 属性的命名使用驼峰法,并且首字母小写,例如tableName 、 instance;
应用类库命名空间规范
应用类库的根命名空间统一为app(可以设置app_namespace配置参数更改); 例如:app\index\controller\Index 和 app\index\model\User;
请求
Thinkphp助手参数
1.判断变量是否定义
input('?get.id'); input('?post.name');
变量类型方法:
方法 | 描述 |
---|---|
param |
获取当前请求的变量 |
get |
获取 $_GET 变量 |
post |
获取 $_POST 变量 |
put |
获取 $_PUT 变量 |
delete |
获取 $_DELETE 变量 |
session |
获取 $_SESSION 变量 |
cookie |
获取 $_COOKIE 变量 |
request |
获取 $_REQUEST 变量 |
server |
获取 $_SERVER 变量 |
env |
获取 $_ENV 变量 |
route |
获取 路由(包括PATHINFO) 变量 |
file |
获取 $_FILE 变量 |
获取PARAM参数
input('param.name'); // 获取单个参数 input('param.'); // 获取全部参数 // 下面是等效的 input('name'); input('');
获取GET参数
// 获取单个变量 input('get.id'); // 使用过滤方法获取 默认为空字符串 input('get.name'); // 获取全部变量 input('get.');
使用过滤方法
input('get.name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤 input('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤 input('post.name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤
使用变量修饰符
input('get.id/d'); input('post.name/s'); input('post.ids/a');
修饰符
修饰符 | 作用 |
---|---|
s |
强制转换为字符串类型 |
d |
强制转换为整形类型 |
b |
强制转换为布尔类型 |
a |
强制转换为数组类型 |
f |
强制转换为浮点类型 |
请求
Request对象的主要职责是统一和更安全地获取当前的请求信息,你需要避免直接操作
$_GET、$_POST、$_REQUEST、$_SESSION、$_COOKIE、$_FILES等全局变量,而是统一使用Request对象提供的方法来获取请求变量。
ThinkPHP5的Request对象由think\Request类完成。
$request = Request::instance();
也可以使用助手函数
$request = request();
`$request = Request::instance();` // 获取当前域名 `echo 'domain: ' . $request->domain() . '<br/>';`
方法 | 描述 |
---|---|
param | 获取当前请求的变量(自动识别GET、POST、PUT请求的一种变量获取方式,是系统推荐的获取请求参数方法) |
get | 获取$_GET变量 |
post | 获取$_POST变量 |
put | 获取PUT变量 |
delete | 获取DELETE变量 |
session | 获取$_SESSION变量 |
cookie | 获取$_COOKIE变量 |
request | 获取$_REQUEST变量 |
server | 获取$_SERVER变量 |
env | 获取$_ENV变量 |
file | 获取$_FILES变量 |
改变变量
如果需要更改请求变量的值,可以通过下面的方式:
更改GET变量
Request::instance()->get(['id'=>10]);
更改POST变量
Request::instance()->post(['name'=>'thinkphp']);
尽量避免直接修改
$_GET或者
$_POST数据,同时也不能直接修改param变量,例如下面的操作是无效的。
更改请求变量
Request::instance()->param(['id'=>10]);
伪静态
URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置url_html_suffix参数随意在URL的最后增加你想要的静态后缀,而不影响当前操作的正常执行。例如,我们设置
'url_html_suffix'=>'shtml'
如果要获取当前的伪静态后缀,可以使用Request对象的ext方法。
路由
路由功能由
\think\Route类完成。
由于
ThinkPHP5.0默认采用的URL规则是:
http://server/module/controller/action/param/value/.....
路由的作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。
路由模式
ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:
普通模式
关闭路由,完全使用默认的
PATH_INFO方式URL:
url_route_on => false,
路由关闭后,不会解析任何路由规则,采用默认的
PATH_INFO模式访问URL:
http://serverName/index.php/module/controller/action/param/value/...
混合模式
开启路由,并使用路由定义+默认
PATH_INFO方式的混合:
'url_route_on' => true,
'url_route_must' => false,
该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其他的仍然按照第一种普通模式的
PATH_INFO模式访问URL。
强制模式
开启路由,并设置必须定义路由才能访问:
url_route_on => true,
url_route_must => true,
这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
首页的路由规则采用
/定义即可,例如下面把网站首页路由输出
Hello,world!我们需要在
route.php这个文件中配置路由,要使用官方的
use think\Route
Route::get('/',function(){ return 'Hello,world!'; });
路由定义
路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。
动态注册
路由定义采用
\think\Route类的rule方法注册,通常是在应用的路由配置文件
application/route.php进行注册,格式是:
Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
use think\Route; // 注册路由到index模块的Index控制器的list操作 Route::rule('new/:id','index/Index/list');
我们访问:
http://serverName/new/5
会自动路由到:
http://serverName/index/index/list/id/5
ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。
路由命名标识必须唯一,定义后可以用于URL的快速生成。
可以在rule方法中指定请求类型,不指定的话默认为任何请求类型,例如:
Route::rule('new/:id','News/update','POST');表示定义的路由规则在POST请求下才有效。注意:请求类型参数必须大写。
请求类型包括: | 类型 |
---|---|
GET | GET请求 |
POST | POST请求 |
PUT | PUT请求 |
DELETE | DELETE请求 |
* | 任何请求类型 |
系统提供了为不同的请求类型定义路由规则的简化方法,例如:
Route::get('new/:id','News/read'); // 定义GET请求路由规则 Route::post('new/:id','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
如果要定义get和post请求支持的路由规则,也可以用:
Route::rule('new/:id','News/read','GET|POST');
也可以批量注册路由规则
Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']); Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']); Route::post(['new/:id'=>'News/update','blog/:name'=>'Blog/detail']);
注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测。
定义路由配置文件
除了支持动态注册,也可以直接在应用目录下面的route.php的最后通过返回数组的方式直接定义路由规则
return [ 'new/:id' => 'News/read', 'blog/:id' => ['Blog/update',['method' => 'post|put'], ['id' => '\d+']], ];
路由动态注册和配置定义的方式可以并存。由于检测机制问题,动态注册的性能比路由配置要高一些,尤其是多种请求类型混合定义的时候。
默认情况下,只会加载一个路由配置文件
route.php,如果需要定义多个路由文件,可以修改
route_config_file的配置参数,例如:
定义路由配置文件(数组) 'route_config_file' => ['route', 'route1', 'route2'],
资源路由
5.0支持设置
RESTFul请求的资源路由,方式如下:
Route::resource('blog','index/blog');
或者在路由配置文件中使用
__rest__添加资源路由定义:
return [ // 定义资源路由 '__rest__'=>[ // 指向index模块的blog控制器 'blog'=>'index/blog', ],
设置过后会自动注册7个路由规则,如下:
标识 | 请求类型 | 生成路由规则 | 对应操作方法(默认) |
---|---|---|---|
index | GET | blog |
index |
create | GET | blog/create |
create |
save | POST | blog |
save |
read | GET | blog/:id |
read |
edit | GET | blog/:id/edit |
edit |
update | PUT | blog/:id |
update |
delete | DELETE | blog/:id |
delete |
具体指向的控制器由路由地址决定,例如上面的设置,会对应index模块的blog控制器,你只需要为Blog控制器创建以上对应的操作方法就可以支持下面的URL访问:
http://serverName/blog/ http://serverName/blog/128 http://serverName/blog/28/edit
Blog控制器中对应的方法如下:
namespace app\index\controller; class Blog { public function index() { dump(index); } public function update($id) { dump(update); } public function delete($id) { dump(delete); } }
快捷路由
快捷路由允许你快速给控制器注册路由,并且针对不同的请求类型可以设置方法前缀
// 给User控制器设置快捷路由 Route::controller('user','index/User');
User控制器定义如下:
namespace app\index\controller; class User { public function getInfo() { } public function getPhone() { } public function postInfo() { } public function putInfo() { } public function deleteInfo() { } }
我们可以通过下面的URL访问
get http://localhost/user/info get http://localhost/user/phone post http://localhost/user/info put http://localhost/user/info delete http://localhost/user/info
权限控制
Base.php,需要鉴权继承该类即可
<?php namespace app\index\controller; use think\Controller; use think\Request; class Base extends Controller { //用来存放需要用户登录之后才能操作的方法的集合 protected $is_check_login = ['']; public function _initialize() { if (!$this->isLogin() && (in_array(Request::instance()->action(), $this->is_check_login)||$this->is_check_login[0]=='*')){ return $this->error('请先登录系统!','index/Index/login'); } } public function isLogin() { return session('?name'); } }
GoodsController,进行所有方法鉴权
<?php namespace app\index\controller; use app\index\controller\Base; class Goods extends Base { protected $is_check_login = ['*']; public function add() { echo '我想要购买商品'; } public function edit() { echo '我想退货'; } public function delete() { echo '我不想买了'; } }
CommentController,仅对Add方法路由鉴权
<?php namespace app\index\controller; use app\index\controller\Base; class Comment extends Base { protected $is_check_login = ['add']; public function add() { echo '我想发表评论'; } public function edit() { echo '我想编辑一下自己的评论'; } }
- PHP学习笔记(一):ThinkPHP起步
- ThinkPHP 学习笔记二 模版
- [thinkphp5 学习笔记] model类型
- ThinkPHP学习笔记(八)一个用户增删改查的小例子
- thinkphp学习笔记之多表查询
- 学习ThinkPHP笔记
- ThinkPHP学习笔记(一)ThinkPHP部署
- No37-【原】ThinkPHP3.2.3学习笔记
- thinkphp中cookie学习笔记
- ThinkPHP学习笔记(8)在网页中配置Config文件内容
- thinkphp6.0学习笔记之数据库的查询表达式
- ThinkPHP3.2.3学习笔记3---视图
- 学习 ThinkPHP 框架笔记
- ThinkPHP3.2.3学习笔记2---模型
- thinkPHP学习笔记之安装配置篇
- Thinkphp5 —— 学习笔记
- thinkphp学习笔记1—目录结构和命名规则
- ThinkPHP学习笔记(十六)使用视图(数据库视图)和缓存
- ThinkPHP学习笔记(二十)模板中使用函数和标签
- 【学习笔记】thinkphp 生成静态缓存的雪崩问题