4.controller

goer ... 2022-01-07 Thinkphp
  • Php
  • Thinkphp
大约 3 分钟

控制器

[toc]

# controller

可以无需继承任何的基础类,也可以继承官方封装的\think\Controller类或者其他的控制器类。

# 控制器定义

控制器的实际位置:application\index\controller\Index.php

namespace app\index\controller;

class Index 
{
    public function index()
    {
        return 'index';
    }
}
1
2
3
4
5
6
7
8
9

命名空间默认以app为根命名空间。 app\模块\controller

控制器的根命名空间可以设置,例如我们在应用配置文件中修改:

// 修改应用类库命名空间
'app_namespace' => 'application',
1
2

继承了think\Controller类的话,可以直接调用think\Viewthink\Request类的方法

namespace app\index\controller;

use think\Controller;

class Index extends Controller
{
    public function index()
    {
        // 获取包含域名的完整URL地址
        $this->assign('domain',$this->request->url(true));
        return $this->fetch('index');
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 控制器初始化

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

public function _initialize()
{
	//控制器的方法调用之前首先
	echo '最开始执行我';
}
1
2
3
4
5

# 页面跳转

经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\think\Controller类内置了两个跳转方法successerror,用于页面跳转提示。

public function index()
{	
    if($res){
        $this->success('添加成功','跳转地址');
	}else{
        $this->error('添加失败');
    }
}
1
2
3
4
5
6
7
8

successerror方法都可以对应的模板

//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
1
2
3
4

# 重定向

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

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

上面的用法是跳转到News模块的category操作,重定向后会改变当前的URL地址。

或者直接重定向到一个指定的外部URL地址,例如:

//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);
1
2

可以在重定向的时候通过session闪存数据传值,例如

$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
1

使用redirect助手函数还可以实现更多的功能,例如可以记住当前的URL后跳转

redirect('News/category')->remember();
1

# 空操作

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

例如,下面我们用空操作功能来实现一个城市切换的功能。 我们只需要给City控制器类定义一个_empty (空操作)方法:

<?php
namespace app\index\controller;

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

    //注意 showCity方法 本身是 protected 方法
    protected function showCity($name)
    {
        //和$name这个城市相关的处理
         return '当前城市' . $name;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

接下来,我们就可以在浏览器里面输入

http://serverName/index/city/beijing/
http://serverName/index/city/shanghai/
http://serverName/index/city/shenzhen/
1
2
3

由于City并没有定义beijingshanghai或者shenzhen操作方法,因此系统会定位到空操作方法 _empty中去解析,_empty方法的参数就是当前URL里面的操作名,因此会看到依次输出的结果是:

当前城市:beijing
当前城市:shanghai
当前城市:shenzhen
1
2
3