ThinkPHP5 今日总结

ThinkPHP5 0921 总结

路由 控制器 请求


一、路由

路由模式

普通模式(important)

关闭路由,完全使用默认的PATH_INFO方式URL:
‘url_route_on’ => false

http://serverName/index.php/module/controller/action/param/value/...

URL 生成

URL生成使用 \think\Url::build() 方法或者使用系统提供的助手函数url(),参数一致

Url::build('地址表达式',['参数'],['URL后缀'],['域名'])
url('地址表达式',['参数'],['URL后缀'],['域名']) -- 助手函数

路由方式是路由到模块/控制器/操作

地址表达式和参数
// 生成index模块 blog控制器的read操作 URL访问地址
Url::build('index/index/test','id=5&name=thinkphp');
// 使用助手函数
url('index/index/test','id=5&name=thinkphp');

效果图:
在这里插入图片描述

URL后缀

默认情况下,系统会自动读取url_html_suffix配置参数作为URL后缀(默认为html),如果我们设置了

'url_html_suffix'   => 'shtml'

那么自动生成的URL地址变为:

/index.php/blog/5.shtml

如果你希望指定URL后缀生成,则可以使用:

源码:
/**
* Url生成
* @param string $url 路由地址
* @param string|array $vars 变量
* @param bool|string $suffix 生成的URL后缀
* @param bool|string $domain 域名
* @return string
*/

function url($url = '', $vars = '', $suffix = true, $domain = false)
{
    return Url::build($url, $vars, $suffix, $domain);
}
Url::build('index/blog/read','id=5','shtml');
url('index/blog/read','id=5','shtml');

二、控制器

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

namespace app\index\controller;

class Index 
{
    public function index()
    {
        return 'index';
    }
}

控制器类文件的实际位置是

application\index\controller\Index.php

控制器初始化

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

namespace app\index\controller;

use think\Controller;

class Index extends Controller
{
    
     public function _initialize()
    {
        echo 'init' . '<br />';
    }

    public function show() {
        return 'show';
    }
    
}

访问网站目录
效果图:
在这里插入图片描述

前置操作

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

namespace app\index\controller;

use think\Controller;

class Index extends Controller
{
    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';
    }
}

访问页面 hello 方法
效果图:
在这里插入图片描述

跳转和重定向

跳转
public function index()
{
    $this->success('操作成功', 'User/list');
    //  $this->error('操作失败'); 同理
}

运行方法
在这里插入图片描述

重定向

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

//重定向到News模块的Category操作
$this->redirect('News/category', ['cate_id' => 2]);

访问:
在这里插入图片描述
跳转和重定向的URL地址不需要再使用url方法进行生成,会自动调用,请注意避免,否则会导致多次生成而出现两个重复的URL后缀

空操作

空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。

 public function _empty($name)
    {
        //把所有城市的操作解析到city方法
        return $name;
    }

效果图:
在这里插入图片描述

空控制器

空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化。

<?php
namespace app\index\controller;

use think\Request;

class Error 
{
    public function index(Request $request)
    {
        //根据当前控制器名来判断要执行那个城市的操作
        $cityName = $request->controller();
        return $this->city($cityName);
    }
    
    //注意 city方法 本身是 protected 方法
    protected function city($name)
    {
        //和$name这个城市相关的处理
         return '当前城市' . $name;
    }
}

效果图:
在这里插入图片描述
空控制器和空操作还可以同时使用,用以完成更加复杂的操作。

空控制器Error是可以定义的

// 更改默认的空控制器名
'empty_controller'      => 'MyError',

当找不到控制器的时候,就会定位到MyError控制器类进行操作。

多级控制器

controller 里面可以存放目录可以访问
在这里插入图片描述

资源控制器

资源控制器可以让你轻松的创建RESTFul资源控制器,可以通过命令行生成需要的资源控制器

在这里插入图片描述
域名是没有改变,是通过请求的类型不同完成不同的逻辑处理

三、请求

请求信息

要获取当前的请求信息,可以使用\think\Request类

$request = Request::instance();

也可以使用助手函数

$request = request();

在这里插入图片描述

输入变量

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

使用 input 方法
在这里插入图片描述

变量过滤

框架默认没有设置任何过滤规则,你可以是配置文件中设置全局的过滤规则:

// 默认全局过滤方法 用逗号分隔多个
'default_filter'         => 'htmlspecialchars',
变量修饰符

用法:

input('变量类型.变量名/修饰符');

Request::instance()->变量类型('变量名/修饰符');

ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括:

在这里插入图片描述
如果你要获取的数据为数组,请一定注意要加上 /a 修饰符才能正确获取到。

请求类型

在很多情况下面,我们需要判断当前操作的请求类型是GET、POST、PUT、DELETE或者HEAD,一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求。

ThinkPHP5.0 取消了用于判断请求类型的系统常量(如IS_GET,IS_POST等),统一采用 think\Request类 处理请求类型。

用法如下:

// 是否为 GET 请求
if (Request::instance()->isGet()) echo "当前为 GET 请求";
// 是否为 POST 请求
if (Request::instance()->isPost()) echo "当前为 POST 请求";
// 是否为 PUT 请求
if (Request::instance()->isPut()) echo "当前为 PUT 请求";
// 是否为 DELETE 请求
if (Request::instance()->isDelete()) echo "当前为 DELETE 请求";
// 是否为 Ajax 请求
if (Request::instance()->isAjax()) echo "当前为 Ajax 请求";
// 是否为 Pjax 请求
if (Request::instance()->isPjax()) echo "当前为 Pjax 请求";
// 是否为手机访问
if (Request::instance()->isMobile()) echo "当前为手机访问";
// 是否为 HEAD 请求
if (Request::instance()->isHead()) echo "当前为 HEAD 请求";
// 是否为 Patch 请求
if (Request::instance()->isPatch()) echo "当前为 PATCH 请求";
// 是否为 OPTIONS 请求
if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求";
// 是否为 cli
if (Request::instance()->isCli()) echo "当前为 cli";
// 是否为 cgi
if (Request::instance()->isCgi()) echo "当前为 cgi";

助手函数:

// 是否为 GET 请求
if (request()->isGet()) echo "当前为 GET 请求";
....

依赖注入

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

namespace app\index\controller;

use think\Request;

class Index
{
	protected $request;
    
	public function __construct(Request $request)
    {
    	$this->request = $request;
    }
    
    public function hello()
    {
        return 'Hello,' . $this->request->param('name') . '!';
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱学习的 W

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

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

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

打赏作者

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

抵扣说明:

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

余额充值