ThinkPHP5学习历程(第三更)

ThinkPHP 5历程(学习中,嘿嘿)

  • 一、基本用法
    • 1.1 开始
      • 1.1.1 下载ThinkPHP框架
      • 1.1.2 phpstrom简单设置
        • 2.1 快捷键设置
        • 2.2 在使用TP5中会创建很多Class为了方便我也进行了一些简单配置
        • 2.3 TP5的路由好长好长啊
      • 1.1.3 错误提示设置
    • 1.2 路由请求
      • 1.2.1 获取路由参数常用的方法
          • 1. 默认方法
          • 2. 引入Request模块
            • 1.常规使用
            • 2.助手函数
    • 1.3 自定义路由
      • 1.3.1 在配置文件 (config.php) 中开启路由配置
      • 1.3.2 自定义路由
      • 1.3.3 复杂的路由
        • 1.路由地址
        • 2.请求类型+常规使用
        • 3.批量注册路由
        • 4.路由参数
        • 5.变量规则
        • 6.重点重点重点
  • 二、遇到的bug
    • 2.1 No input file specified.
  • 三、思路
  • 四、结语

一、基本用法

1.1 开始

1.1.1 下载ThinkPHP框架

  1. TP5下载方式开发文档已经很详细了;按着步骤来操作就行了
  2. 细节:记得要下载 应用项目、核心框架这两个项目;然后把 ‘核心框架framework’ 放在 '应用项目’并且改名字为thinkphp
  3. TP5下载方法

安装好的目录如下:
ThinkPHP5学习历程(第三更)_第1张图片

1.1.2 phpstrom简单设置

2.1 快捷键设置

点击File->settings->Keymap可以设置快捷键
例如格式化代码快捷键,我本人时用惯了Ctrl+K的;在不冲突的情况下;可以把默认的改成Ctrl+K
Reformat Code
默认格式化快捷键是Ctrl+Alt+L
自定义格式化代码快捷键Ctrl+K

在这里插入图片描述

2.2 在使用TP5中会创建很多Class为了方便我也进行了一些简单配置

正常我们创建类时需要自己填写namespace(app\test1\controller),但是我觉得很麻烦;ThinkPHP5学习历程(第三更)_第2张图片
于是我设置了一下
File->setings->Project->找到对应的项目->选中application文件夹->点击Sources->看到右侧Source Folders->然后右下角有个小P->点击然后有弹框->输入app就好了
具体操作:

现在我创建类就不用自己写namespace了,啊哈哈哈

2.3 TP5的路由好长好长啊

看到这么长的路由我萌生退意了;要是搞一下controller然后传几个参数;我连自己写了什么看不清了;
这显然很不行啊!!!!
ThinkPHP5学习历程(第三更)_第3张图片
于是我搞了一下我的小皮面板;点击网站->创建网站;简单的配置了一下;
细节:1、PHP版本要和你的代码开发版本的一样
细节:2、根目录要选中到TP5框架下的public文件夹;不然就会访问不到
ThinkPHP5学习历程(第三更)_第4张图片
嗯嗯,精简了很多!!!
ThinkPHP5学习历程(第三更)_第5张图片
当然,这只是第一步;如果有需要我们可以到application下的route.php文件配置自己的route规则;但是目前我还没学习到;等后期继续简化路由

1.1.3 错误提示设置

在application文件夹下找到config.php文件
找到 ‘show_error_msg’ 的 false 改成 => true
如果还觉得信息不够详细的话还可以 ‘app_debug’ 把 false 改成 => true
目前感觉开发状态中;只设置 app_debug 为true就够用了
ThinkPHP5学习历程(第三更)_第6张图片
截图如下:
ThinkPHP5学习历程(第三更)_第7张图片
ThinkPHP5学习历程(第三更)_第8张图片

1.2 路由请求

这里我说一下比较常用的方法和内容

1.2.1 获取路由参数常用的方法

先说一下路由的访问规则;默认是 模块/控制器/操作名称
注意点:我要访问Test5.php下的hello($id)方法
是用:http://www.shopping.cn:8899/api/Test5/hello?id=123

如果是访问 v1/Test1.php 下的hello($id)方法就有点小区别;
要这样访问:http://www.shopping.cn:8899/api/v1.Test1/hello?id=123

ThinkPHP5学习历程(第三更)_第9张图片
介绍完路由的访问规则;接下来进入正题:

1. 默认方法

也就是直接用参数;在 hello() 上直接传一个 id 值 ;然后直接使用 $id 就可以获取了
ThinkPHP5学习历程(第三更)_第10张图片
ThinkPHP5学习历程(第三更)_第11张图片

2. 引入Request模块

先引用Request use think\Request;

可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括 $_GET、 $_POST、 $_REQUEST、 $_SERVER、 $_SESSION、 $_COOKIE、 $_ENV等系统变量,以及文件上传信息。

开发文档上的内容:

变量类型方法包括:

方法 描述
param 获取当前请求的变量
get 获取 $_GET 变量
post 获取 $_POST 变量
put 获取 PUT 变量
delete 获取 DELETE 变量
session 获取 $_SESSION 变量
cookie 获取 $_COOKIE 变量
request 获取 $_REQUEST 变量
server 获取 $_SERVER 变量
env 获取 $_ENV 变量
route 获取 路由(包括PATHINFO) 变量
file 获取 $_FILES 变量

大家对 get 和 post 很熟悉;但是对 put 和 delete 可能会感到陌生;这是源于REST设计风格;大家感兴趣可以去百度搜索一下

URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。
GET 获取一个资源
POST 添加一个资源
PUT 修改一个资源
DELETE 删除一个资源

1.常规使用
  1. 获取URL的所有内容:$request = Request::instance();
  2. 获取传过来的所有参数用:$all=Request::instance()->param();//获取全部参数;
  3. 如果想获取某个值如id:$id=Request::instance()->param('id');//获取变量,不区分类型直接获取
  4. 获取get请求参数用:$getall=Request::instance()->get();//获取get 的参数
  5. 获取某个get变量:$id=Request::instance()->get('id');
  6. 获取post请求的参数:$postall=Request::instance()->post();//post 获取post参数
  7. 获取某个post变量如name:$name=Request::instance()->post('name');
2.助手函数

param方法会把当前请求类型的参数和PATH_INFO变量以及GET请求合并。
input函数默认就采用PARAM变量读取方式

  1. 获取URL的所有内容$request =request();
  2. 获取传过来的所有参数用:$all=input('');或者input('param.');//获取全部参数;
  3. 如果想获取某个值如id:$id=input('param.id');//获取变量,不区分类型直接获取
  4. 获取get请求参数用:$getall=input('get.');//获取get 参数
  5. 获取get的某个参数如id:$id=input('get.id');
  6. 获取post请求的参数:$postall=Request::instance()->post();//post 获取post参数
  7. 获取post的某个参数如name:$name=input('post.name');

我这里只是写了比较常用的;具体的话可以看开发文档;开发手册上写的很全面
开发手册:https://www.kancloud.cn/manual/thinkphp5/158834

1.3 自定义路由

1.3.1 在配置文件 (config.php) 中开启路由配置

把 ‘url_route_on’ 的 false 改成true
ThinkPHP5学习历程(第三更)_第12张图片

根据开发手册上的内容路由有三种模式,分别是:普通模式、混合模式还有强制模式
ThinkPHP5学习历程(第三更)_第13张图片
ThinkPHP5学习历程(第三更)_第14张图片
ThinkPHP5学习历程(第三更)_第15张图片

  1. 普通模式也就是默认模式;也就是模块/控制器/操作名称;
  2. 混合模式就是,如果有自定义的路由,使用自定义,未定义的按照默认来(已经定义好的,只能按照定义的来,否则会报错)
  3. 强制模式就是强制使用自定义路由,除了自定义的路由可以通过;其他的都会报错

目前我个人使用的是混合模式;

1.3.2 自定义路由

找到application文件夹下的route.php
使用自定义路由时要先use一下use think\Route;
接下来就是注册路由了
注册路由规则如下:

 use think\Route;
// 注册路由  api模块的Test5控制器的hello操作
Route::rule('hello/:id','api/Test5/hello');

默认方法:
ThinkPHP5学习历程(第三更)_第16张图片
是不是感觉路由很长,很复杂;再试试自定义的
ThinkPHP5学习历程(第三更)_第17张图片
是不是感觉舒服了很多。
看了开发文档的路由介绍;感觉…嗯嗯…

1.3.3 复杂的路由

我看了好久的文档,简单的提炼了一下注册路由的规则
重点:

Route::rule(‘路由表达式’,‘路由地址’,‘请求类型’,‘路由参数(数组)’,‘变量规则(数组)’);

1.路由地址

定义方式 定义格式
方式1:路由到模块/控制器 ‘[模块/控制器/操作]?额外参数1=值1&额外参数2=值2…’
方式2:路由到重定向地址 ‘外部地址’(默认301重定向) 或者 [‘外部地址’,‘重定向代码’]
方式3:路由到控制器的方法 ‘@[模块/控制器/]操作’
方式4:路由到类的方法 ‘\完整的命名空间类::静态方法’ 或者 ‘\完整的命名空间类@动态方法’
方式5:路由到闭包函数 闭包函数定义(支持参数传入)

这么多方法看到头晕了…

方式一:路由到模块/控制器
'[模块/控制器/操作]?额外参数1=值1&额外参数2=值2…'

// 路由到默认或者绑定模块
'blog/:id'=>'blog/read',
// 路由到index模块
'blog/:id'=>'index/blog/read',

这里涉及到绑定模块的问题,简单的提一下;不然看开发文档也有点懵(都是写在route.php文件里)

// 绑定当前的URL到 index模块
Route::bind('index');
// 绑定当前的URL到 index模块的blog控制器
Route::bind('index/blog');
// 绑定当前的URL到 index模块的blog控制器的read操作
Route::bind('index/blog/read');

如果写了绑定模块的话,

//没写
Route::rule('hello/:id','api/Test5/hello');
//写了
Route::bind('api');
Route::rule('hello/:id','Test5/hello');//可以不用写api

方式二:路由到重定向地址
重定向的外部地址必须以“/”或者http开头的地址。

'blog/:id'=>'/blog/read/id/:id''blog/:id'=>'blog/read'

虽然都是路由到同一个地址,但是前者采用的是301重定向的方式路由跳转,这种方式的好处是URL可以比较随意(包括可以在URL里面传入更多的非标准格式的参数),而后者只是支持模块和操作地址。

方式三:路由到控制器的方法----->‘@[模块/控制器/]操作’

这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块。

定义如下路由后:'blog/:id'=>'@index/blog/read',
系统会直接执行 Loader::action('index/blog/read');
相当于直接调用 \app\index\controller\blog类的read方法。

Blog类定义如下:

namespace app\index\controller;

class Blog {
    public function read($id){
        return 'read:'.$id;
    }
}

2.请求类型+常规使用

看一下例子

Route::rule('hello/:id','api/Test5/hello','GET'); //GET请求
Route::rule('hello/:id','api/Test5/hello','GET|POST');//GET或者POST请求(他们之间是用 | 隔开)
//也可以用下面这种
Route::get('hello/:id','api/Test5/hello'); // 定义GET请求路由规则
Route::any('hello/:id','api/Test5/hello'); // 所有请求都支持的路由规则

请求类型
ThinkPHP5学习历程(第三更)_第18张图片

3.批量注册路由

Route::rule([
‘路由规则1’=>‘路由地址和参数’,
‘路由规则2’=>[‘路由地址和参数’,‘匹配参数(数组)’,‘变量规则(数组)’]

],’’,‘请求类型’,‘匹配参数(数组)’,‘变量规则’);

个人感觉就是创建数组思维一样;一个键一个值

如果在外面和规则里面同时传入了匹配参数和变量规则的话,路由规则定义里面的最终生效,但请求类型参数以最外层决定

就是 匹配参数和变量规则如果出现冲突以最内层为准;但是请求类型get,post以外层为准
批量路由注册和单个注册其实是差不多的,换汤不换药

//手册的案例
Route::rule([
    'new/:id'  =>  'News/read',
    'blog/:id' =>  ['Blog/update',['ext'=>'shtml'],['id'=>'\d{4}']],
    ...
],'','GET',['ext'=>'html'],['id'=>'\d+']);
//以上的路由注册,最终blog/:id只会在匹配shtml后缀的访问请求,id变量的规则则是 \d{4}。

// 批量注册GET路由
Route::get([
    'new/:id'  =>  'News/read',
    'blog/:id' =>  ['Blog/edit',[],['id'=>'\d+']]
    ...
]);

4.路由参数

ThinkPHP5学习历程(第三更)_第19张图片

 'method'=>'POST|GET|PUT',//请求类型检测
        'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
        'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
        'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
        'https'=>true,//检测是否https请求
        'before_behavior'=>'\app\index\behavior\UserCheck',//前置行为(检测)
        'after_behavior'=>'\app\index\behavior\ReadInfo',//后置行为(执行)
        'callback'=>'my_check_fun',//自定义检测方法
        'merge_extra_vars'=>true,//合并额外参数
        'cache'=>3600,//请求缓存V5.0.1+
        'bind_model'=>['User','name'],//绑定模型V5.0.1+
        'param_depr'=>'',//路由参数分隔符V5.0.2+
        'ajax'=>true,//V5.0.2+
        'pjax'=>true,//V5.0.2+

5.变量规则

  1. 全局变量规则
// 设置name变量规则(采用正则定义)
Route::pattern('name','\w+');
// 支持批量添加
Route::pattern([
    'name'  =>  '\w+',
    'id'    =>  '\d+',
]);
  1. 局部变量规则
// 定义GET请求路由规则 并设置name变量规则
Route::get('new/:name','News/read',[],['name'=>'\w+']);
  1. 完整URL规则
    如果要对整个URL进行规则检查,可以进行__url__ 变量规则,例如:
// 定义GET请求路由规则 并设置完整URL变量规则
Route::get('new/:id','News/read',[],['__url__'=>'new\/\w+$']);

如果一个变量同时定义了全局规则和局部规则,局部规则会覆盖全局变量的定义。
感觉就是---->就近原则

变量规则主要就是用正则表达式对路由进行处理;和之前的路由注册差不多;就是多了一个参数。
开发文档的变量规则解释

6.重点重点重点

重点重点重点;重要的事情要说三次
Route::rule(‘路由表达式’,‘路由地址’,‘请求类型’,‘路由参数(数组)’,‘变量规则(数组)’);

二、遇到的bug

2.1 No input file specified.

解决方法:
把:
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

改为:
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
在index.php后面加多一个?
ThinkPHP5学习历程(第三更)_第20张图片

三、思路

四、结语

刚开始学习;如果有什么不足之处;或者不对的地方可以指出哦!

你可能感兴趣的:(php,ThinkPHP,5)