当前位置:   article > 正文

thinkphp的路由、控制器、请求等三大模块_thinkphp 多个route文件

thinkphp 多个route文件

路由

路由(route)是Thinkphp框架中的一个知识点,它的作用是可以让url网址访问变的简洁,规范。同时也可以将较长的ulr网址变得更加简短,方便记忆和访问

开启路由的方式:

fastadmin目录->application目录->congig.php文件

如何使用路由;

  1. // 是否开启路由
  2. 'url_route_on' => true,
  3. // 路由使用完整匹配
  4. 'route_complete_match' => false,
  5. // 路由配置文件(支持配置多个)
  6. 'route_config_file' => ['route'],
  7. // 是否强制使用路由
  8. 'url_route_must' => false,

路由的模式

ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:

一、普通模式

简单来说就是一大串url

  1. 关闭路由,完全使用默认的 PATH_INFO 方式URL:
  2. 'url_route_on' => false,
  3. 路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:
  4. http://域名/index/index/index/aa/11/bb/22/...

二、混合模式

简单来说就是一部分使用定义的规则访问一部分还是普通的一大串url访问

  1. 开启路由,并使用路由定义+默认 PATH_INFO 方式的混合:
  2. 'url_route_on' => true,
  3. 'url_route_must'=> false,
  4. 该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL。

三、强制模式

简单来说就是强制性给每一个路由定义一个名字用来访问它

路由定义

动态和静态

路由规则通常可以包含变量,路由规则中包含变量(包括可选变量)的就称该条路由规则为动态路由,没有包含任何变量的路由我们称之为静态路由

  1. // 静态路由规则
  2. Route::rule('hello','index/Index/hello');
  3. // 动态路由规则
  4. Route::rule('hello/:name','index/Index/hello');

静态路由和动态路由的解析过程是完全不同的,简单点说的话,动态路由需要遍历所有规则依次匹配(除非第一条就匹配成功),是一个多次匹配的过程,而静态路由是一次快速匹配(当然特殊情况下也会有静态路由无效的情况)。

  1. 可以在rule方法中指定请求类型,不指定的话默认为任何请求类型,例如:
  2. Route::rule('new/:id','News/update','POST');

表示定义的路由规则在POST请求下才有效。

请求类型包括:

类型描述
GETGET请求
POSTPOST请求
PUTPUT请求
DELETEDELETE请求
*任何请求类型
  1. 注意:请求类型参数必须大写。
  2. # 系统提供了为不同的请求类型定义路由规则的简化方法,例如:
  3. Route::get('new/:id','News/read'); // 定义GET请求路由规则
  4. Route::post('new/:id','News/update'); // 定义POST请求路由规则
  5. Route::put('new/:id','News/update'); // 定义PUT请求路由规则
  6. Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
  7. Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
  8. 注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测。

URL生成

ThinkPHP5.0支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。

  1. URL生成使用 \think\Url::build() 方法或者使用系统提供的助手函数url(),参数一致:
  2. \think\Url::build() 方法:
  3. Url::build('地址表达式',['参数'],['URL后缀'],['域名'])
  4. 或者使用系统提供的助手函数url():
  5. url('地址表达式',['参数'],['URL后缀'],['域名'])
  6. 需要注意的是,URL地址生成不会检测路由的有效性,只是按照给定的路由地址和参数生成符合条件的路由规则。

控制器

ThinkPHP V5.0的控制器定义比较灵活,可以无需继承任何的基础类,也可以继承官方封装的  \think\Controller  类或者其他的控制器类。

控制器定义

  1. #控制器类文件的实际位置是
  2. namespace app\index\controller;
  3. class Index extends Frontend
  4. {
  5. protected $noNeedLogin = '*';
  6. protected $noNeedRight = '*';
  7. protected $layout = '';
  8. public function index()
  9. {
  10. #直接使用view助手函数渲染模板输出
  11. return $this->view->fetch();
  12. }
  13. }

控制器初始化

如果你的控制器类继承了\think\Controller类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。

  1. #定义一个命名空间放控制器类文件
  2. namespace app\index\controller;
  3. #引入一个模块
  4. use think\Controller;
  5. 定义一个方法类继承于Controller
  6. class Index extends Controller
  7. {
  8. #_initialize初始化的意思
  9. public function _initialize()
  10. {
  11. echo 'init<br/>';
  12. }
  13. public function hello()
  14. {
  15. return 'hello';
  16. }
  17. public function data()
  18. {
  19. return 'data';
  20. }
  21. }
  22. 如果访问
  23. http://域名/index.php/index/Index/hello
  24. 会输出
  25. init
  26. hello

控制器的前置操作

可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。

  1. #表示这些方法不使用前置方法,
  2. ['except' => '方法名,方法名']
  3. #表示只有这些方法使用前置方法。
  4. ['only' => '方法名,方法名']
  1. #示例代码
  2. namespace app\index\controller;
  3. use think\Controller;
  4. class Index extends Controller
  5. {
  6. # $beforeActionList 是一个属性可以指定某个方法为其他方法的前置操作
  7. protected $beforeActionList = [
  8. 'first',
  9. 'second' => ['except'=>'hello'],
  10. 'three' => ['only'=>'hello,data'],
  11. ];
  12. protected function first()
  13. {
  14. echo 'first<br/>';
  15. }
  16. protected function second()
  17. {
  18. echo 'second<br/>';
  19. }
  20. protected function three()
  21. {
  22. echo 'three<br/>';
  23. }
  24. public function hello()
  25. {
  26. return 'hello';
  27. }
  28. public function data()
  29. {
  30. return 'data';
  31. }
  32. }
  33. (
  34. 访问
  35. http://localhost/index.php/index/Index/hello
  36. 最后的输出结果是
  37. first
  38. three
  39. hello
  40. )
  41. (
  42. 访问
  43. http://localhost/index.php/index/Index/data
  44. 的输出结果是:
  45. first
  46. second
  47. three
  48. data
  49. )

控制器的跳转和重定向

跳转和重定向的URL地址不需要再使用url方法进行生成,会自动调用,请注意避免,否则会导致多次生成而出现两个重复的URL后缀

跳转

在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\think\Controller类内置了两个跳转方法successerror,用于页面跳转提示。

  1. namespace app\index\controller;
  2. use think\Controller;
  3. use app\index\model\User;
  4. class Index extends Controller
  5. {
  6. public function index()
  7. {
  8. $User = new User; //实例化User对象
  9. $result = $User->save($data);
  10. if($result){
  11. //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
  12. $this->success('新增成功', 'User/list');
  13. } else {
  14. //错误页面的默认跳转页面是返回前一页,通常不需要设置
  15. $this->error('新增失败');
  16. }
  17. }
  18. }

  1. #成功提示
  2. $this->success('$msg','$url','$data',$wait,'$header');
  3. #错误的
  4. $this->error('$msg','$url','$data',$wait,'$header');
变量含义类型

$msg

提示信息

mixed

$url

跳转的 URL 地址

string

$data

返回的数据

mixed

$wait跳转等待时间 单位为秒

int

$header

发送的 Header 信息

array

error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会自动转换为default_ajax_return配置的格式返回信息。 successAjax请求下不返回信息,需要开发者自行处理。

重定向

\think\Controller类的redirect方法可以实现页面的重定向功能。

redirect方法的参数用法和Url::build方法的用法一致

  1. //重定向到News模块的Category操作
  2. $this->redirect('News/category', ['cate_id' => 2]);
  3. //重定向到指定的URL地址 并且使用302
  4. $this->redirect('http://t域名/index/2',302);
  5. 使用redirect助手函数还可以实现更多的功能,例如可以记住当前的URL后跳转
  6. redirect('News/category')->remember();
  7. 需要跳转到上次记住的URL的时候使用:
  8. redirect()->restore();

控制器的空操作

空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,

利用这个机制,我们可以实现错误页面和一些URL的优化。

  1. <?php
  2. namespace app\index\controller;
  3. class City
  4. {
  5. #空操作:没有找到对应的方法的时候执行
  6. public function _empty()
  7. {
  8. echo 1;
  9. }
  10. public function first()
  11. {
  12. echo 'first';
  13. }
  14. ?>
  15. 例如执行:
  16. http://fastadmin.cn/index/City/123asf
  17. 返回
  18. 1
  19. 例如执行:
  20. http://fastadmin.cn/index/City/first
  21. 返回
  22. first

控制器的资源管理器

请求类型生成路由规则对应操作方法
GETblogindex
GETblog/createcreate
POSTblogsave
GETblog/:idread
GETblog/:id/editedit
PUTblog/:idupdate
DELETEblog/:iddelete

请求

请求信息

  1. #如果要获取当前的请求信息,可以使用\think\Request类,
  2. $request = Request::instance();
  3. #也可以使用助手函数
  4. $request = request();

当然,最方便的还是使用注入请求对象的方式来获取变量。

  1. //使用\think\Request类,获取当前的请求信息
  2. $request = Request::instance();
  3. // 获取当前域名
  4. echo 'domain: ' . $request->domain() . '<br/>';
  5. 输出结果为:
  6. domain: http://tp5.com
  7. // 获取当前入口文件
  8. echo 'file: ' . $request->baseFile() . '<br/>';
  9. 输出结果为:
  10. file: /index.php
  11. // 获取当前URL地址 不含域名
  12. echo 'url: ' . $request->url() . '<br/>';
  13. 输出结果为:
  14. url: /index/index/hello.html?name=thinkphp
  15. // 获取包含域名的完整URL地址
  16. echo 'url with domain: ' . $request->url(true) . '<br/>';
  17. 输出结果为:
  18. url with domain: http://tp5.com/index/index/hello.html?name=thinkphp
  19. // 获取当前URL地址 不含QUERY_STRING
  20. echo 'url without query: ' . $request->baseUrl() . '<br/>';
  21. 输出结果为:
  22. url without query: /index/index/hello.html
  23. // 获取URL访问的ROOT地址
  24. echo 'root:' . $request->root() . '<br/>';
  25. 输出结果为:
  26. root:
  27. // 获取URL访问的ROOT地址
  28. echo 'root with domain: ' . $request->root(true) . '<br/>';
  29. 输出结果为:
  30. root with domain: http://tp5.com
  31. // 获取URL地址中的PATH_INFO信息
  32. echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
  33. 输出结果为:
  34. pathinfo: index/index/hello.html
  35. // 获取URL地址中的PATH_INFO信息 不含后缀
  36. echo 'pathinfo: ' . $request->path() . '<br/>';
  37. 输出结果为:
  38. pathinfo: index/index/hello
  39. // 获取URL地址中的后缀信息
  40. echo 'ext: ' . $request->ext() . '<br/>';
  41. 输出结果为:
  42. ext: html

输入变量

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

检测变量是否设置

  1. //可以使用has方法来检测一个变量参数是否设置,如下:
  2. Request::instance()->has('id','get');
  3. Request::instance()->has('name','post');
  4. //或者使用助手函数
  5. input('?get.id');
  6. input('?post.name');
  7. 变量检测可以支持所有支持的系统变量。

变量获取

变量获取使用\think\Request类的如下方法及参数:

变量类型方法('变量名/变量修饰符','默认值','过滤方法')

变量类型方法包括:

方法描述
param获取当前请求的变量
get获取 $_GET 变量
post获取 $_POST 变量
put获取 PUT 变量
delete获取 DELETE 变量
session获取 $_SESSION 变量
cookie获取 $_COOKIE 变量
request获取 $_REQUEST 变量
server获取 $_SERVER 变量
env获取 $_ENV 变量
route获取 路由(包括PATHINFO) 变量
file获取 $_FILES 变量
  1. #获取PARAM变量
  2. #PARAM变量是框架提供的用于自动识别GET、POST或者PUT请求的一种变量获取方式,是系统推荐的获取请求参数的方法
  3. // 获取当前请求的name变量
  4. Request::instance()->param('name');
  5. // 获取当前请求的所有变量(经过过滤)
  6. Request::instance()->param();
  7. // 获取当前请求的所有变量(原始数据)
  8. Request::instance()->param(false);
  9. // 获取当前请求的所有变量(包含上传文件)
  10. Request::instance()->param(true);
  11. #param方法会把当前请求类型的参数和PATH_INFO变量以及GET请求合并。
  12. #使用助手函数实现:
  13. input('param.name');
  14. 或者
  15. input('name');
  16. input('param.');
  17. 或者
  18. input('');

变量过滤

全局的过滤规则的配置文件在fasetadmin->application->config

也支持使用Request对象进行全局变量的获取过滤,过滤方式包括函数、方法过滤,以及PHP内置的Types of filters,我们可以设置全局变量过滤方法,例如:

  1. #使用Request对象进行全局变量的获取过滤
  2. Request::instance()->filter('htmlspecialchars');
  3. #支持设置多个过滤方法,例如:
  4. Request::instance()->filter(['strip_tags','htmlspecialchars']);
  5. #也可以在获取变量的时候添加过滤方法,例如:
  6. Request::instance()->get('name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤
  7. Request::instance()->param('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤
  8. Request::instance()->post('name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤
  9. #可以支持传入多个过滤规则,例如:
  10. Request::instance()->param('username','','strip_tags,strtolower'); // 获取param变量 并依次调用strip_tags、strtolower函数过滤

获取部分变量

  1. // 只获取当前请求的id和name变量
  2. Request::instance()->only('id,name');
  3. 或者使用数组方式
  4. // 只获取当前请求的id和name变量
  5. Request::instance()->only(['id','name']);
  6. #默认获取的是当前请求参数,如果需要获取其它类型的参数,可以使用第二个参数,例如:
  7. // 只获取GET请求的id和name变量
  8. Request::instance()->only(['id','name'],'get');
  9. // 只获取POST请求的id和name变量
  10. Request::instance()->only(['id','name'],'post');

排除部分变量

  1. // 排除id和name变量
  2. Request::instance()->except('id,name');
  3. 或者使用数组方式
  4. // 排除id和name变量
  5. Request::instance()->except(['id','name']);
  6. #同样支持指定变量类型获取:
  7. // 排除GET请求的id和name变量
  8. Request::instance()->except(['id','name'],'get');
  9. // 排除POST请求的id和name变量
  10. Request::instance()->except(['id','name'],'post');

变量修饰符

input函数支持对变量使用修饰符功能,可以更好的过滤变量。

  1. input('变量类型.变量名/修饰符');
  2. 或者
  3. Request::instance()->变量类型('变量名/修饰符');
  4. 例如:
  5. //input('变量类型.变量名/修饰符');
  6. input('get.id/d'); //强制转换get提交过来的id转换成整形
  7. input('post.name/s'); //强制转换post提交过来的name转换成字符串型
  8. input('post.ids/a'); //强制转换post提交过来的id转换成数组类型
  9. 或者
  10. //Request::instance()->变量类型('变量名/修饰符');
  11. Request::instance()->get('id/d'); //强制转换get提交过来的id转换成整形
ThinkPHP5.0版本默认的变量修饰符是/s
修饰符作用
s强制转换为字符串类型
d强制转换为整型类型
b强制转换为布尔类型
a强制转换为数组类型
f强制转换为浮点类型

更改变量

  1. // 更改GET变量
  2. Request::instance()->get(['id'=>10]);
  3. // 更改POST变量
  4. Request::instance()->post(['name'=>'thinkphp']);
  5. //尽量避免直接修改$_GET 或者 $_POST数据,同时也不能直接修改param变量,例如下面的操作是无效的:
  6. // 更改请求变量
  7. Request::instance()->param(['id'=>10]);

获取请求类型

  1. // 是否为 GET 请求
  2. if (Request::instance()->isGet()) echo "当前为 GET 请求";
  3. 或者助手函数
  4. if (request()->isGet()) echo "当前为 GET 请求";
  5. // 是否为 POST 请求
  6. if (Request::instance()->isPost()) echo "当前为 POST 请求";
  7. 或者助手函数
  8. if (request()->isPost()) echo "当前为 POST 请求";
  9. // 是否为 PUT 请求
  10. if (Request::instance()->isPut()) echo "当前为 PUT 请求";
  11. 或者助手函数
  12. if (request()->isPut()) echo "当前为 PUT 请求";
  13. // 是否为 DELETE 请求
  14. if (Request::instance()->isDelete()) echo "当前为 DELETE 请求";
  15. 或者助手函数
  16. if (request()->isDelete()) echo "当前为 DELETE 请求";
  17. // 是否为 Ajax 请求
  18. if (Request::instance()->isAjax()) echo "当前为 Ajax 请求";
  19. 或者助手函数
  20. if (request()->isAjax()) echo "当前为 Ajax 请求";
  21. // 是否为 Pjax 请求
  22. if (Request::instance()->isPjax()) echo "当前为 Pjax 请求";
  23. 或者助手函数
  24. if (request()->isPjax()) echo "当前为 Pjax 请求";
  25. // 是否为手机访问
  26. if (Request::instance()->isMobile()) echo "当前为手机访问";
  27. 或者助手函数
  28. if (request()->isMobile()) echo "当前为手机访问";
  29. // 是否为 HEAD 请求
  30. if (Request::instance()->isHead()) echo "当前为 HEAD 请求";
  31. 或者助手函数
  32. if (request()->isHead()) echo "当前为 HEAD 请求";
  33. // 是否为 Patch 请求
  34. if (Request::instance()->isPatch()) echo "当前为 PATCH 请求";
  35. 或者助手函数
  36. if (request()->isPatch()) echo "当前为 PATCH 请求";
  37. // 是否为 OPTIONS 请求
  38. if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求";
  39. 或者助手函数
  40. if (request()->isOptions()) echo "当前为 OPTIONS 请求";
  41. // 是否为 cli
  42. if (Request::instance()->isCli()) echo "当前为 cli";
  43. 或者助手函数
  44. if (request()->isCli()) echo "当前为 GET ";
  45. // 是否为 cgi
  46. if (Request::instance()->isCgi()) echo "当前为 cgi";
  47. 或者助手函数
  48. if (request()->isCgi()) echo "当前为 cgi";

依赖注入

ThinkPHP的依赖注入(也称之为控制反转)是一种较为轻量的实现,无需任何的配置,并且主要针对访问控制器进行依赖注入。可以在控制器的构造函数或者操作方法(指访问请求的方法)中类型声明任何(对象类型)依赖,这些依赖会被自动解析并注入到控制器实例或方法中。

简单来说就是:反向注入,谁调用他,他就会把这个方法注入给谁。

请求缓存

请求缓存仅对GET请求有效,有两种方式可以设置请求缓存:

路由参数

可以在路由规则里面定义cache参数开启当前路由规则的请求缓存

  1. // 定义GET请求路由规则 并设置3600秒的缓存
  2. Route::get('new/:id','News/read',['cache'=>3600]);
  3. //第二次访问相同的路由地址的时候,会自动获取请求缓存的数据响应并输出

:id:page表示使用当前请求的param参数进行动态标识替换,也就是根据id和page变量进行3600秒的请求缓存。

  1. //默认请求缓存的标识为当前访问的 pathinfo 地址,可以定义请求缓存的标识
  2. // 定义GET请求路由规则 并设置3600秒的缓存
  3. Route::get('new/:id','News/read',[
  4. 'cache' => [ 'new/:id/:page',3600]
  5. ]);
  6. //如果cache参数传入false,则表示关闭当前路由的请求缓存(即使开启全局请求缓存)。
  7. // 定义GET请求路由规则 并设置3600秒的缓存
  8. Route::get('new/:id','News/read',[
  9. 'cache' => [ 'new/:id/:page',3600,'news']
  10. ]);

动态参数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/351330
推荐阅读