ThinkPHP-2进阶

请求

请求对象

1.当控制器继承了控制器基类时,会自动被注入 Request 请求对象的功能

image-20210311150258655

2.不继承控制器基类

image-20210311151704815

4.通过构造方法进行注入

image-20210311151751055

5.使用facade方式应用于没有进行依赖注入时使用 Request 对象的场合

use think\facade\Request;
class Index extends Controller
{
	public function facade()
    {
        return Request::param('name');
    }
}

image-20210311152636077

6.使用助手函数

image-20210311152837125

请求信息
class Index extends Controller
{
    public function index()
    {
        return Request::url().'</br>'.Request::url(true);
    }
}

image-20210311153232720

image-20210311153244374

image-20210311153333540

image-20210311153304391

请求变量

1.Request 对象支持全局变量检测,获取和安全过滤,支持$_GET,$_POST

2.使用 has() 方法,可以检测全局变量是否已经设置

class Index extends Controller
{
    public function index()
    {
        dump(Request::has('id','get'));
        dump(Request::has('name','post'));
    }
}

image-20210311154918108

3.支持变量表

image-20210311155000612

4.param() 变量方法时识别 GET,POST 等的当前请求,推荐使用

image-20210311155149754

对于变量的过滤,在全局设置一个过滤函数,也可以单独对某个变量过滤

# config/app.php

// 默认全局过滤方法 用逗号分隔多个
'default_filter'         => 'htmlspecialchars',
如果设置过滤方法,上传变量信息会获取不到

# 单个设置
dump(Request::param('name','','htmlspecialchars'));

image-20210311155848273

# public/test/test.html
<div>
    <form action="http://localhost:8000/index/index/index" method="post" enctype="multipart/form-data">
        <input type="file" name="image">
        <input type="submit" value="confirm">
    </form>
<!--    <input type="submit" id="button" value="confirm">-->
</div>

image-20210311160800525

5.使用依赖注入,可以将变量作为对象的属性进行调用

public function read(\think\Request $request)
{
    return $request->name;
}

image-20210311174059935

6.路由获取

class Index extends Controller
{    
	public function read($id)
    {
        dump(Request::get());
        dump(Request::param());
        dump(Request::route());
    }
}

# route/route.php
\think\facade\Route::get('route/:id','index/Index/read');

image-20210311174543152

param::get() 不支持路由变量

7.除了 ::server()、::env() 方法外,其他方法传递的变量名区分大小写

因为 ::server()、::env() 属于系统变量,会强制转换为大写后获取值

8.默认值

class Index extends Controller
{
    public function index()
    {
        dump(Request::param('name', 'ocean'));
        dump(Request::param());
        dump(Request::param(false));
        dump(Request::param(true));
    }
}

image-20210311175108590

9.only

    public function only()
    {
        dump(Request::only(['id']));
    }

image-20210311175429302

except

    public function except()
    {
        dump(Request::except(['id']));
    }

image-20210311175418814

10.使用变量修饰符,可以将参数强制转换为指定的类型

/s(字符串) 
/d(整型) 
/b(布尔) 
/a(数组) 
/f(浮点)
助手函数简化

image-20210311175926494

    public function func()
    {
        dump(input('?get.id'));
    }

image-20210311175947069

请求类型

可以使用 method() 方法来判断当前的请求类型

image-20210312140212163

# public/test/test.html
    <form action="http://localhost:8000/index/index/check" method="post" enctype="multipart/form-data">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="confirm">
    </form>
# 设置隐藏字段 _method,可以在 app.php 文件中设置为其他关键字  
# <input type="hidden" name="_method" value="PUT">

# index/Index.php/check
    public function check()
    {
        return Request::method();
#       return Request::method(true); true获取原始请求

    }

image-20210312145940568

Ajax/Pjax 伪装

使用 ?_ajax=1?_pjax=1,并使用 isAjax() 和 isPjax()

用 method 无法判断

在 app.php 也可以更改 ajax 和 pjax 的名称

HTTP头信息

使用 header() 方法输出 HTTP 头信息,返回数组类型,也可以单信息获取

    public function check()
    {
        dump(Request::header());
        dump(Request::header('host'));
    }

image-20210312151013250

伪静态

路由变量最后有 .html 作为伪静态

1.Url 伪静态后缀可以在 app.php 中设置

    // URL伪静态后缀
    'url_html_suffix'        => 'html',

2.使用 url::build() 获取当前完整 url,得到默认后缀为 .html

public function check()
{
    return \think\facade\Url::build();
}

image-20210312152101618

3.如果地址栏用后缀访问成功后,可以使用 Request::ext() 方法得到当前伪静态

public function check()
{
    return \think\facade\Url::build().', '.Request::ext();
}

image-20210312152259912

image-20210312152421815

参数绑定

1.默认参数

public function check($id=33,$uid=22)
{
    return 'id:'.$id.','.'uid:'.$uid;
}

image-20210312154314544

image-20210312154342165

2.成对解析,可以换顺序

image-20210312154434597

    // URL参数方式 0 按名称成对解析 1 按顺序解析
    'url_param_type'         => 0,
请求缓存

部分功能 tp6 取消

全局缓存

// 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
'request_cache'          => false,
// 请求缓存有效期,建议3600,时间太短没有意义
'request_cache_expire'   => null,  

// 全局请求缓存排除规则
'request_cache_except'   => [],

开启缓存后,第二次访问时,会自动获取请求缓存的数据响应输出,并发送304状态码

单独缓存

\think\facade\Route::get('route/:id','index/Index/read')->cache(3600);

image-20210312155455700

响应

响应输出,包括 return(),json(),view()

    public function response()
    {
        return response('index','201');
#        return response('index')->code('201');
    }

image-20210313114437865

respond() 方法,可以设置第二参数,状态码,或调用 code() 方法

重定向

1.使用 redirect() 方法可以实现页面重定向

    public function response()
    {
        return redirect('http://www.ocean888.cn');
        # 注意一定有 http://
    }

2.站内重定向,直接输入路由地址或相对地址即可,需要用顶级域名,二级会错误

return ('index');

3.通过 params() 方法传递数组参数键值对的方式,进行跳转

return redirect('check')->params(['id'=>'222']);
文件下载

文本文件和图片文件都可以使用 download() 方法下载

image-20210313134857008

容器

依赖注入

手册说明

依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于 URL 请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成

# test/model/One.php
<?php
namespace app\test\model;
class One
{
    protected $name='lisi';
    public $sex='male';
}

# test/controller/Inject.php
<?php
namespace app\test\controller;
use app\test\model\One;
class Inject
{
    protected $name;

    public function __construct(One $one)
    {
        $this->one=$one;
    }

    public function index()
    {
        return $this->one->sex;
    }
}

依赖注入:即允许通过类的方法传递对象的能力,并且限制了对象的类型(约束),传递的对象背后的哪个类被自动绑定并且实例化了

容器

依赖注入的类统一由容器管理,大多数情况下是自动绑定和自动实例化

如果想手动来完成绑定和实例化,可以使用 bind() 和 app() 助手函数来实现

    public function index()
    {
        bind('one','app\test\model\One');
        // 绑定 app\model\One 下的 one 对象
        return app('one')->sex;
    }

bind(‘one’,’…’) 绑定类库标识,这个标识具有唯一性,以便快速调用

app(‘one’) 快速调用,并自动实例化对象,表示严格保持一致包括大小写

自动实例化对象的方式,是采用单例模式实现,如果想重新实例化一个对象,则每次调用总会重新实例化

使用 bind([]) 可以实现批量绑定,只不过系统有专门提供批量绑定的文件

bind([
    'one'=>'app\model\One',
    'user'=>'app\model\User'
]);
return app('one')->name;


bind([
    'one'=>\app\model\One::class,
    'user'=>\app\model\User::class
]);
return app('one')->name;
# ::class 模式,不需要单引号,而且需要在最前面加上\

系统提供了 view/provider.php 文件,用于批量绑定类到容器中

image-20210314182947227

return app('request')->param('name');
Facade

1.创建静态调用

Facade,即门面设计模式,为容器的类提供了一种静态的调用方式

之前使用的 请求 Request::,路由 Route::,数据库 Db::,都是静态调用

image-20210314185550604

钩子

概念

1.钩子和行为在 tp6.0 的版本被废弃,用时间来取代,但意思相同

2.行为就是在系统执行的流程中执行的一个动作,如:当执行到路由时,对路由设置一些列的检测,即为行为

系统自带钩子

# app/tags.php
return [
    // 应用初始化
    'app_init'     => ['app\test\behavior\Test',],
    // 应用开始
    'app_begin'    => [],
    // 模块初始化
    'module_init'  => [],
    // 操作开始执行
    'action_begin' => [],
    // 视图内容过滤
    'view_filter'  => [],
    // 日志写入
    'log_write'    => [],
    // 应用结束
    'app_end'      => [],
];

# app/test/behavior/Test.php
<?php
namespace app\test\behavior;

class Test
{
    public function run($params)
    {
        echo $params.'只要触发,就执行';
    }
}

image-20210314192845840

自定义钩子

Hook::listen(‘绑定钩子’,‘参数’)

# app/controller/inject.php
public function bhv()
{
	\think\facade\Hook::listen('eat','干饭');
}

# app/tags.php
return [
    'eat'          => ['app\test\behavior\Test'],
];

image-20210314194007954

初始化

# app/tags.php
return [
    // 应用初始化
    'app_init'     => ['app\test\behavior\Test',],
];    


# app/test/behavior/Test.php
<?php
namespace app\test\behavior;

class Test
{
    public function run($params)
    {
        echo $params.'只要触发,就执行';
    }

    public function appInit()
    {
        echo '应用初始化';
    }
}

app_init 对应的方法是 appInit(有下划线的大写)

image-20210314195002101

image-20210314195054903

中间件

类似于钩子,主要用于拦截和过滤 HTTP 请求,并进行相应处理

可以通过命令行模式,在应用目录下生成一个中间件文件和文件夹

php think make:middleware Check

image-20210314200859512

<?php

namespace app\http\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {
    }
}
# handle 不能改
# Closure 匿 名函数

n($params)
{
echo $params.‘只要触发,就执行’;
}

public function appInit()
{
    echo '应用初始化';
}

}


app_init 对应的方法是 appInit(有下划线的大写)

[外链图片转存中...(img-hyjgMvbo-1615809974519)]

[外链图片转存中...(img-qlQIWa9Z-1615809974520)]

### 中间件

类似于钩子,主要用于拦截和过滤 HTTP 请求,并进行相应处理

可以通过命令行模式,在应用目录下生成一个中间件文件和文件夹

```php
php think make:middleware Check

[外链图片转存中…(img-WL9QEkya-1615809974521)]

<?php

namespace app\http\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {
    }
}
# handle 不能改
# Closure 匿 名函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NaecoYes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值