AI智能
改变未来

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/128http://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/infoget http://localhost/user/phonepost http://localhost/user/infoput http://localhost/user/infodelete http://localhost/user/info

权限控制

Base.php,需要鉴权继承该类即可

<?phpnamespace 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,进行所有方法鉴权

<?phpnamespace 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方法路由鉴权

<?phpnamespace 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 \'我想编辑一下自己的评论\';}}
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Thinkphp5学习笔记