thinkphp的路由、控制器、请求等三大模块

5 篇文章 0 订阅
5 篇文章 0 订阅

路由

路由(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请求下才有效。

请求类型包括:

类型描述
GETGET请求
POSTPOST请求
PUTPUT请求
DELETEDELETE请求
*任何请求类型
注意:请求类型参数必须大写。
# 系统提供了为不同的请求类型定义路由规则的简化方法,例如:
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'); // 所有请求都支持的路由规则

注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测。

URL生成

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类内置了两个跳转方法successerror,用于页面跳转提示。

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配置的格式返回信息。 successAjax请求下不返回信息,需要开发者自行处理。

重定向

\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

控制器的资源管理器

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

请求

请求信息


#如果要获取当前的请求信息,可以使用\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转换成整形
ThinkPHP5.0版本默认的变量修饰符是/s
修饰符作用
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']
]);

动态参数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是天呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值