admin 管理员组

文章数量: 887016

目录

  • 一、路由
    • 1.路由的作用
    • 2路由模式
    • 3.路由注册
    • 4.路由绑定
    • 5.URL生成
  • 二、控制器
    • 1.控制器定义
    • 2.前置操作
    • 注意:前置方法执行完成后,hello方法再执行,输出hello
    • 3.跳转与重定向
    • 4.空操作
    • 5.空控制器
  • 三、请求
    • 1.请求信息
    • 2.输入变量
    • 3.更改变量
    • 4.请求类型
    • 5.HTTP头信息
    • 6.伪静类
    • 7.参数绑定

一、路由

1.路由的作用

路由的作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。

2路由模式

  1. path_info模式 index.php(入口文件)
    http://域名/项目名/入口文件/模块名/控制器/方法名/键1/值1/键2/值2
'url_route_on'  =>  false, //关闭路由
  1. 混合模式
    混合模式:即可以使用path_info,也可以使用路由模式,并不是对同一个操作方法。混和模式指的是:有两三个操作方法,一个使用path_info一个使用路由等。
'url_route_on'  		=>  true,  //开启路由
'url_route_must'		=>  false, //自定义关闭

3.强制模式
开启路由,并设置必须定义路由才能访问:

'url_route_on'  		=>  true, //开启路由
'url_route_must'		=>  true, //自定义关闭

3.路由注册

格式:

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

路由参数与变量规则介绍略,感兴趣者看开发文档。

举例:

use think\facade\Route;

// 注册 GET 请求的路由
Route::rule('new', 'index/News/read', 'GET');

http://serverName/new  ===  http://serverName/index/news/read
// 注册 POST 请求的路由
Route::rule('user', 'user/update', 'POST');

http://serverName/user  ===  http://serverName/user/update

// 注册带有参数的路由
Route::rule('user/:id', 'index/News/read', 'GET');

http://serverName/new/5  ===  http://serverName/index/news/read/id/5

4.路由绑定

说明:把当前的URL绑定到模块/控制器/操作,最多支持绑定到操作级别。
绑定到的界别可以省略不写
举例:http://serverName/index/news/read/id/5

// 绑定当前的URL到 index模块
Route::bind('index');
====  http://serverName/news/read/id/5	 
    
// 绑定当前的URL到 index模块的blog控制器
Route::bind('index/news');
====  http://serverName/read/id/5	 
 
// 绑定当前的URL到 index模块的blog控制器的read操作
Route::bind('index/news/read');
====  http://serverName/id/5	  

5.URL生成

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

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

举例:

// 输出 blog/thinkphp
Url::build('blog/read', 'name=thinkphp');
Url::build('blog/read', ['name' => 'thinkphp']);
url('blog/read', 'name=thinkphp');

// 输出 blog/5
Url::build('blog/get', 'id=5');
Url::build('blog/get', ['id' => 5]);
url('blog/get', 'id=5');

// 输出 blog/2015/05
Url::build('blog/archive', 'year=2015&month=05');
Url::build('blog/archive', ['year' => '2015', 'month' => '05']);
url('blog//archive', 'year=2015$month=05');

二、控制器

1.控制器定义

控制器文件放在application/module/controller下,类名文件名保持大小写一致,采用驼峰法命名(首字母大写)。

举例:
定义一个Idex类,文件位置:application\index\controller*Index.php*

namespace app\index\controller;

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

2.前置操作

说明:设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,人话就是:在执行一个方法前,会先执行一些在 beforeActionList中的一些方法。

['except' => '方法名,方法名']

except是指哪些方法不能调用前面的方法

['only' => '方法名,方法名']

only是指哪些方法可以调用前面的方法

举例:

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';
    }
}

访问http://localhost/index.php/index/Index/hello时,就是调用hello方法时,会查找前置方法,前置方法中有first、second、three方法,调用三者方法的结果分别是first、second、three,但是second与three加了限定值,所以结果为first、three、hello. first与three是前置方法输出的,hello是hello方法输出的。

注意:前置方法执行完成后,hello方法再执行,输出hello

3.跳转与重定向

  1. 两个跳转方法success和error,用于页面跳转提示。
    跳转地址是可选的,success方法的默认跳转地址是$_SERVER[“HTTP_REFERER”],error方法的默认跳转地址是javascript:history.back(-1);。
$this->success();
$this->error();
if(true){
            //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
            $this->success('新增成功', 'User/list');
        } else {
            //错误页面的默认跳转页面是返回前一页,通常不需要设置
            $this->error('新增失败');
        }

/**
     * 操作成功返回的数据
     * @param string $msg    提示信息
     * @param mixed  $data   要返回的数据
     * @param int    $code   错误码,默认为1
     * @param string $type   输出类型
     * @param array  $header 发送的 Header 信息
     */
$this->result($msg, $data, $code, $type, $header);
  1. $this->redirect();
    \think\Controller类的redirect方法可以实现页面的重定向功能。
    edirect方法的参数用法和Url::build方法的用法一致(URL生成)
    举例:
//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp/blog/2',302);

使用redirect助手函数:

redirect('News/category')

4.空操作

在控制器类中定义一个_empty()的 空操作方法,当系统找不到指定的操作方法时,会自动触发空操作的方法。
举例:

<?php
namespace app\index\controller;

class City 
{
    public function _empty($name)
    {
        
        return '空方法'.$name;
    }  
}

访问不存在的a方法:

5.空控制器

给项目定义一个Error控制器类,当系统找不到指定的控制器时,会触发空控制器返回。
举例:

<?php
namespace app\index\controller;

class Error 
{
    public function index($name)
    {
             
        return '空控制器'.$name;
    }
        
}

访问不存在的a控制器类:

三、请求

1.请求信息

如果要获取当前的请求信息,可以使用\think\Request类,在这里插入代码片

$request = Request::instance();

助手函数:

$request = request();

获取URL信息:

$request = Request::instance();
// 获取当前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo 'file: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root:' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo 'pathinfo: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo 'ext: ' . $request->ext() . '<br/>';

结果为:

domain: http://www.fast
file: /index.php
url: /day1/abc/def
url with domain: http://www.fast/day1/abc/def
url without query: /day1/abc/def
root:
root with domain: http://www.fast
pathinfo: day1/abc/def
pathinfo: day1/abc/def
ext:

常用:

方法	说明
url()	获取当前完整URL
baseUrl()	获取不含参数信息的URL地址
query()	获取当前URL地址的参数信息
domain()	获取当前包含协议的域名
method()	获取当前请求类型
module()	获取当前模块
controller()	获取当前控制器
action()	获取当前方法

2.输入变量

  1. 检测变量是否设置
has()	检测变量是否设置

可以使用has方法来检测一个变量参数是否设置,如下:

Request::instance()->has('id','get');
Request::instance()->has('name','post');

或者使用助手函数

input('?get.id');
input('?post.name');

  1. 变量获取
方法	说明

param()	获取当前请求变量
get()	获取$_POST变量
post()	获取$_GET变量
session()	获取$_SESSION变量
cookie()	获取$_COOKIE变量
request()	获取$_REQUEST变量
file()	获取$_FILES变量

举例:

// 获取当前请求的name变量
Request::instance()->param('name');
// 获取当前请求的所有变量(经过过滤)
Request::instance()->param();
// 获取当前请求的所有变量(原始数据)
Request::instance()->param(false);
// 获取当前请求的所有变量(包含上传文件)
Request::instance()->param(true);

使用助手函数实现:

input('param.name');
input('param.');
或者
input('name');
input('');

3.更改变量

// 更改GET变量
Request::instance()->get(['id'=>10]);
// 更改POST变量
Request::instance()->post(['name'=>'thinkphp']);

4.请求类型

// 是否为 GET 请求
if (Request::instance()->isGet()) echo "当前为 GET 请求";
// 是否为 POST 请求
if (Request::instance()->isPost()) echo "当前为 POST 请求";
/ 是否为 Ajax 请求
if (Request::instance()->isAjax()) echo "当前为 Ajax 请求";
// 是否为 Pjax 请求
if (Request::instance()->isPjax()) echo "当前为 Pjax 请求";

助手函数

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

5.HTTP头信息

$info = Request::instance()->header();
echo $info['accept'];
echo $info['accept-encoding'];
echo $info['user-agent'];

也可以直接获取某个请求头信息,例如:

$agent = Request::instance()->header('user-agent');

6.伪静类

说明:把动态文件经过修饰,在视觉上呈现为静态文件。

'url_html_suffix' => '后缀名'

7.参数绑定

把URL地址(或者路由地址)中的变量作为操作方法的参数直接传入。

本文标签: 路由 控制器 框架