一、定义
只需要在模块下建立controller文件夹,在controller文件夹中定义一个PHP类文件即可,框架默认就自带了Index控制器。
在index模块下定义一个HelloWorld控制器,并在其中增加base()方法。
访问url
二、初始化
如果控制器类继承了\think\Controller类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。
访问hello这个方法时:
访问data方法时:
三、前置操作
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
[‘except’ => ‘方法名,方法名’] 表示这些方法不使用前置方法,
[‘only’ => ‘方法名,方法名’] 表示只有这些方法使用前置方法
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方法时 输出
first
three
hello
四、空操作
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
由于City并没有定义beijing、shanghai或者shenzhen操作方法,因此系统会定位到空操作方法 _empty中去解析,_empty方法的参数就是当前URL里面的操作名,因此会看到输出的结果是:
五、空控制器
当发生这个情况时,就可以用空控制器来处理。
空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化。
给项目定义一个新的类Error做控制器。
输入http://fastadmin.cn/index/tanjin/
由于系统并不存在tianjin控制器,因此会定位到空控制器(Error)去执行,会看到依次输出的结果是:
当找不到控制器的时候,就会定位到Error控制器类进行操作。
六、页面跳转和重定向
1.页面跳转
<?php
namespace app\index\controller;
use think\Controller; //引用Controller类
class Login extends Controller
{
//登录首页
public function index(){
return view();
}
//登录方法
public function loginCheck(){
//获取参数的封装方法
$user = params('username');
$pwd = params('password');
//验证登录信息(代码略)
...
if('结果'){
//成功跳转
//$this->success('信息提示','跳转地址','用户自定义数据','信息提示显示时长/秒','header信息');
$this->success('登录成功');
}else{
//失败跳转
//$this->success('信息提示','跳转地址','用户自定义数据','信息提示显示时长/秒','header信息');
$this->error('用户名或密码错误');
}
}
}
- success方法的默认跳转地址是$_SERVER[“HTTP_REFERER”],获取当前链接的上一个连接的来源地址;
- error方法的默认跳转地址是javascript:history.back(-1);返回上一页。
success和error方法都可以对应模板,模板可以用框架自带,也可自己设置:
//默认模板
THINK_PATH . 'tpl/dispatch_jump.tpl';
//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
**自定义模板:**
//默认错误跳转对应的模板文件
'dispatch_error_tmpl' => 'public/error',
//默认成功跳转对应的模板文件
'dispatch_success_tmpl' => 'public/success',
2.重定向
\think\Controller类的redirect方法可以实现页面的重定向功能。
//重定向到News模块的Category操作
$this->redirect('News/category');
//带参数的重定向
$this->redirect('News/category', ['cate_id' => 2]);
//重定向到指定的URL地址 并且使用302
$this->redirect('http://thinkphp.cn/blog/2',302);
//重定向的时候通过session闪存数据传值
$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
//记住当前的URL后跳转
redirect('News/category')->remember();
//需要跳转到上次记住的URL
redirect()->restore();