赞
踩
路由(route)是Thinkphp框架中的一个知识点,它的作用是可以让url网址访问变的简洁,规范。同时也可以将较长的ulr网址变得更加简短,方便记忆和访问
开启路由的方式:
fastadmin目录->application目录->congig.php文件
如何使用路由;
- // 是否开启路由
- 'url_route_on' => true,
-
- // 路由使用完整匹配
- 'route_complete_match' => false,
-
- // 路由配置文件(支持配置多个)
- 'route_config_file' => ['route'],
-
- // 是否强制使用路由
- 'url_route_must' => false,
ThinkPHP5.0
的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:
简单来说就是一大串url
- 关闭路由,完全使用默认的 PATH_INFO 方式URL:
- 'url_route_on' => false,
-
- 路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:
- http://域名/index/index/index/aa/11/bb/22/...
简单来说就是一部分使用定义的规则访问一部分还是普通的一大串url访问
- 开启路由,并使用路由定义+默认 PATH_INFO 方式的混合:
- 'url_route_on' => true,
- 'url_route_must'=> false,
- 该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL。
简单来说就是强制性给每一个路由定义一个名字用来访问它
路由规则通常可以包含变量,路由规则中包含变量(包括可选变量)的就称该条路由规则为动态路由,没有包含任何变量的路由我们称之为静态路由。
- // 静态路由规则
- Route::rule('hello','index/Index/hello');
- // 动态路由规则
- Route::rule('hello/:name','index/Index/hello');
静态路由和动态路由的解析过程是完全不同的,简单点说的话,动态路由需要遍历所有规则依次匹配(除非第一条就匹配成功),是一个多次匹配的过程,而静态路由是一次快速匹配(当然特殊情况下也会有静态路由无效的情况)。
- 可以在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'); // 所有请求都支持的路由规则
-
- 注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测。
ThinkPHP5.0支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。
- URL生成使用 \think\Url::build() 方法或者使用系统提供的助手函数url(),参数一致:
-
-
-
- \think\Url::build() 方法:
-
- Url::build('地址表达式',['参数'],['URL后缀'],['域名'])
-
-
- 或者使用系统提供的助手函数url():
- url('地址表达式',['参数'],['URL后缀'],['域名'])
-
-
- 需要注意的是,URL地址生成不会检测路由的有效性,只是按照给定的路由地址和参数生成符合条件的路由规则。
ThinkPHP V5.0的控制器定义比较灵活,可以无需继承任何的基础类,也可以继承官方封装的 \think\Controller
类或者其他的控制器类。
- #控制器类文件的实际位置是
- namespace app\index\controller;
-
-
- class Index extends Frontend
- {
-
- protected $noNeedLogin = '*';
- protected $noNeedRight = '*';
- protected $layout = '';
-
- public function index()
- {
-
- #直接使用view助手函数渲染模板输出
- return $this->view->fetch();
- }
-
- }

如果你的控制器类继承了\think\Controller
类的话,可以定义控制器初始化方法_initialize
,在该控制器的方法调用之前首先执行。
- #定义一个命名空间放控制器类文件
- namespace app\index\controller;
-
- #引入一个模块
- use think\Controller;
-
- 定义一个方法类继承于Controller
- class Index extends Controller
- {
- #_initialize初始化的意思
- public function _initialize()
- {
- echo 'init<br/>';
- }
-
- public function hello()
- {
- return 'hello';
- }
-
- public function data()
- {
- return 'data';
- }
- }
-
-
- 如果访问
- http://域名/index.php/index/Index/hello
-
- 会输出
-
- init
- hello

可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList
属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
- #表示这些方法不使用前置方法,
- ['except' => '方法名,方法名']
-
- #表示只有这些方法使用前置方法。
- ['only' => '方法名,方法名']
- #示例代码
-
- namespace app\index\controller;
-
- use think\Controller;
-
- class Index extends Controller
- {
- # $beforeActionList 是一个属性可以指定某个方法为其他方法的前置操作
- protected $beforeActionList = [
- 'first',
- 'second' => ['except'=>'hello'],
- 'three' => ['only'=>'hello,data'],
- ];
-
- protected function first()
- {
- echo 'first<br/>';
- }
-
- protected function second()
- {
- echo 'second<br/>';
- }
-
- protected function three()
- {
- echo 'three<br/>';
- }
-
- public function hello()
- {
- return 'hello';
- }
-
- public function data()
- {
- return 'data';
- }
- }
-
-
-
-
- (
- 访问
- http://localhost/index.php/index/Index/hello
-
- 最后的输出结果是
- first
- three
- hello
- )
-
-
- (
- 访问
- http://localhost/index.php/index/Index/data
-
- 的输出结果是:
- first
- second
- three
- data
- )

跳转和重定向的URL地址不需要再使用url方法进行生成,会自动调用,请注意避免,否则会导致多次生成而出现两个重复的URL后缀
在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\think\Controller
类内置了两个跳转方法success
和error
,用于页面跳转提示。
- namespace app\index\controller;
-
- use think\Controller;
- use app\index\model\User;
-
- class Index extends Controller
- {
- public function index()
- {
- $User = new User; //实例化User对象
- $result = $User->save($data);
- if($result){
- //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
- $this->success('新增成功', 'User/list');
- } else {
- //错误页面的默认跳转页面是返回前一页,通常不需要设置
- $this->error('新增失败');
- }
- }
- }

- #成功提示
- $this->success('$msg','$url','$data',$wait,'$header');
-
-
- #错误的
-
- $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
配置的格式返回信息。 success在Ajax
请求下不返回信息,需要开发者自行处理。
\think\Controller
类的redirect
方法可以实现页面的重定向功能。
redirect方法的参数用法和Url::build
方法的用法一致
- //重定向到News模块的Category操作
- $this->redirect('News/category', ['cate_id' => 2]);
-
-
- //重定向到指定的URL地址 并且使用302
- $this->redirect('http://t域名/index/2',302);
-
-
- 使用redirect助手函数还可以实现更多的功能,例如可以记住当前的URL后跳转
- redirect('News/category')->remember();
-
-
- 需要跳转到上次记住的URL的时候使用:
- redirect()->restore();
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(
_empty
)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
- <?php
-
- namespace app\index\controller;
- class City
- {
- #空操作:没有找到对应的方法的时候执行
- public function _empty()
- {
- echo 1;
- }
- public function first()
- {
- echo 'first';
- }
- ?>
-
-
-
-
- 例如执行:
- http://fastadmin.cn/index/City/123asf
-
- 返回
- 1
-
-
- 例如执行:
- http://fastadmin.cn/index/City/first
-
- 返回
- first

控制器的资源管理器
请求类型 | 生成路由规则 | 对应操作方法 |
---|---|---|
GET | blog | index |
GET | blog/create | create |
POST | blog | save |
GET | blog/:id | read |
GET | blog/:id/edit | edit |
PUT | blog/:id | update |
DELETE | blog/:id | delete |
-
- #如果要获取当前的请求信息,可以使用\think\Request类,
- $request = Request::instance();
-
-
-
- #也可以使用助手函数
- $request = request();
当然,最方便的还是使用注入请求对象的方式来获取变量。
- //使用\think\Request类,获取当前的请求信息
- $request = Request::instance();
-
- // 获取当前域名
- echo 'domain: ' . $request->domain() . '<br/>';
-
- 输出结果为:
- domain: http://tp5.com
-
-
-
- // 获取当前入口文件
- echo 'file: ' . $request->baseFile() . '<br/>';
-
- 输出结果为:
- file: /index.php
-
-
-
- // 获取当前URL地址 不含域名
- echo 'url: ' . $request->url() . '<br/>';
-
- 输出结果为:
- url: /index/index/hello.html?name=thinkphp
-
-
-
- // 获取包含域名的完整URL地址
- echo 'url with domain: ' . $request->url(true) . '<br/>';
-
- 输出结果为:
- url with domain: http://tp5.com/index/index/hello.html?name=thinkphp
-
-
-
- // 获取当前URL地址 不含QUERY_STRING
- echo 'url without query: ' . $request->baseUrl() . '<br/>';
-
- 输出结果为:
- url without query: /index/index/hello.html
-
-
-
-
- // 获取URL访问的ROOT地址
- echo 'root:' . $request->root() . '<br/>';
-
- 输出结果为:
- root:
-
-
-
- // 获取URL访问的ROOT地址
- echo 'root with domain: ' . $request->root(true) . '<br/>';
-
- 输出结果为:
- root with domain: http://tp5.com
-
-
-
- // 获取URL地址中的PATH_INFO信息
- echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
-
- 输出结果为:
- pathinfo: index/index/hello.html
-
-
-
-
- // 获取URL地址中的PATH_INFO信息 不含后缀
- echo 'pathinfo: ' . $request->path() . '<br/>';
-
- 输出结果为:
- pathinfo: index/index/hello
-
-
-
-
-
- // 获取URL地址中的后缀信息
- echo 'ext: ' . $request->ext() . '<br/>';
-
- 输出结果为:
- ext: html
-

可以通过Request
对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET
、$_POST
、$_REQUEST
、$_SERVER
、$_SESSION
、$_COOKIE
、$_ENV
等系统变量,以及文件上传信息。
-
- //可以使用has方法来检测一个变量参数是否设置,如下:
-
- Request::instance()->has('id','get');
- Request::instance()->has('name','post');
-
-
-
- //或者使用助手函数
- input('?get.id');
- input('?post.name');
-
-
- 变量检测可以支持所有支持的系统变量。
变量获取使用\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 变量 |
- #获取PARAM变量
-
- #PARAM变量是框架提供的用于自动识别GET、POST或者PUT请求的一种变量获取方式,是系统推荐的获取请求参数的方法
-
- // 获取当前请求的name变量
- Request::instance()->param('name');
-
- // 获取当前请求的所有变量(经过过滤)
- Request::instance()->param();
-
- // 获取当前请求的所有变量(原始数据)
- Request::instance()->param(false);
-
- // 获取当前请求的所有变量(包含上传文件)
- Request::instance()->param(true);
-
- #param方法会把当前请求类型的参数和PATH_INFO变量以及GET请求合并。
-
- #使用助手函数实现:
-
- input('param.name');
- 或者
- input('name');
-
- input('param.');
- 或者
- input('');

全局的过滤规则的配置文件在fasetadmin->application->config
也支持使用Request
对象进行全局变量的获取过滤,过滤方式包括函数、方法过滤,以及PHP内置的Types of filters,我们可以设置全局变量过滤方法,例如:
- #使用Request对象进行全局变量的获取过滤
- Request::instance()->filter('htmlspecialchars');
-
-
- #支持设置多个过滤方法,例如:
- Request::instance()->filter(['strip_tags','htmlspecialchars']);
-
-
- #也可以在获取变量的时候添加过滤方法,例如:
- Request::instance()->get('name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤
- Request::instance()->param('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤
- Request::instance()->post('name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤
-
-
- #可以支持传入多个过滤规则,例如:
- Request::instance()->param('username','','strip_tags,strtolower'); // 获取param变量 并依次调用strip_tags、strtolower函数过滤

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

- // 排除id和name变量
- Request::instance()->except('id,name');
- 或者使用数组方式
-
- // 排除id和name变量
- Request::instance()->except(['id','name']);
-
-
- #同样支持指定变量类型获取:
-
- // 排除GET请求的id和name变量
- Request::instance()->except(['id','name'],'get');
-
- // 排除POST请求的id和name变量
- Request::instance()->except(['id','name'],'post');
input函数支持对变量使用修饰符功能,可以更好的过滤变量。
-
-
- input('变量类型.变量名/修饰符');
- 或者
- Request::instance()->变量类型('变量名/修饰符');
-
-
- 例如:
- //input('变量类型.变量名/修饰符');
-
-
- input('get.id/d'); //强制转换get提交过来的id转换成整形
-
- input('post.name/s'); //强制转换post提交过来的name转换成字符串型
-
- input('post.ids/a'); //强制转换post提交过来的id转换成数组类型
-
- 或者
- //Request::instance()->变量类型('变量名/修饰符');
-
- Request::instance()->get('id/d'); //强制转换get提交过来的id转换成整形

修饰符 | 作用 |
---|---|
s | 强制转换为字符串类型 |
d | 强制转换为整型类型 |
b | 强制转换为布尔类型 |
a | 强制转换为数组类型 |
f | 强制转换为浮点类型 |
- // 更改GET变量
- Request::instance()->get(['id'=>10]);
-
-
- // 更改POST变量
- Request::instance()->post(['name'=>'thinkphp']);
-
-
- //尽量避免直接修改$_GET 或者 $_POST数据,同时也不能直接修改param变量,例如下面的操作是无效的:
-
- // 更改请求变量
- Request::instance()->param(['id'=>10]);
- // 是否为 GET 请求
- if (Request::instance()->isGet()) echo "当前为 GET 请求";
- 或者助手函数
- if (request()->isGet()) echo "当前为 GET 请求";
-
- // 是否为 POST 请求
- if (Request::instance()->isPost()) echo "当前为 POST 请求";
- 或者助手函数
- if (request()->isPost()) echo "当前为 POST 请求";
-
- // 是否为 PUT 请求
- if (Request::instance()->isPut()) echo "当前为 PUT 请求";
- 或者助手函数
- if (request()->isPut()) echo "当前为 PUT 请求";
-
- // 是否为 DELETE 请求
- if (Request::instance()->isDelete()) echo "当前为 DELETE 请求";
- 或者助手函数
- if (request()->isDelete()) echo "当前为 DELETE 请求";
-
- // 是否为 Ajax 请求
- if (Request::instance()->isAjax()) echo "当前为 Ajax 请求";
- 或者助手函数
- if (request()->isAjax()) echo "当前为 Ajax 请求";
-
- // 是否为 Pjax 请求
- if (Request::instance()->isPjax()) echo "当前为 Pjax 请求";
- 或者助手函数
- if (request()->isPjax()) echo "当前为 Pjax 请求";
-
- // 是否为手机访问
- if (Request::instance()->isMobile()) echo "当前为手机访问";
- 或者助手函数
- if (request()->isMobile()) echo "当前为手机访问";
-
- // 是否为 HEAD 请求
- if (Request::instance()->isHead()) echo "当前为 HEAD 请求";
- 或者助手函数
- if (request()->isHead()) echo "当前为 HEAD 请求";
-
- // 是否为 Patch 请求
- if (Request::instance()->isPatch()) echo "当前为 PATCH 请求";
- 或者助手函数
- if (request()->isPatch()) echo "当前为 PATCH 请求";
-
- // 是否为 OPTIONS 请求
- if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求";
- 或者助手函数
- if (request()->isOptions()) echo "当前为 OPTIONS 请求";
-
- // 是否为 cli
- if (Request::instance()->isCli()) echo "当前为 cli";
- 或者助手函数
- if (request()->isCli()) echo "当前为 GET ";
-
- // 是否为 cgi
- if (Request::instance()->isCgi()) echo "当前为 cgi";
- 或者助手函数
- if (request()->isCgi()) echo "当前为 cgi";

ThinkPHP的依赖注入(也称之为控制反转)是一种较为轻量的实现,无需任何的配置,并且主要针对访问控制器进行依赖注入。可以在控制器的构造函数或者操作方法(指访问请求的方法)中类型声明任何(对象类型)依赖,这些依赖会被自动解析并注入到控制器实例或方法中。
简单来说就是:反向注入,谁调用他,他就会把这个方法注入给谁。
请求缓存仅对GET请求有效,有两种方式可以设置请求缓存:
可以在路由规则里面定义cache
参数开启当前路由规则的请求缓存
- // 定义GET请求路由规则 并设置3600秒的缓存
- Route::get('new/:id','News/read',['cache'=>3600]);
-
- //第二次访问相同的路由地址的时候,会自动获取请求缓存的数据响应并输出
:id
、:page
表示使用当前请求的param参数进行动态标识替换,也就是根据id和page变量进行3600秒的请求缓存。
- //默认请求缓存的标识为当前访问的 pathinfo 地址,可以定义请求缓存的标识
-
- // 定义GET请求路由规则 并设置3600秒的缓存
- Route::get('new/:id','News/read',[
- 'cache' => [ 'new/:id/:page',3600]
- ]);
-
-
-
- //如果cache参数传入false,则表示关闭当前路由的请求缓存(即使开启全局请求缓存)。
-
-
- // 定义GET请求路由规则 并设置3600秒的缓存
- Route::get('new/:id','News/read',[
- 'cache' => [ 'new/:id/:page',3600,'news']
- ]);

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。