1.控制器定义
2.渲染输出
1.控制器即controller,控制器文件存放在controller目录下,
2.类名和文件名大小写保持一致,并采用驼峰式(首字母大写)
use think\controller
class Index extends controller
{
}
3.继承控制器基类,可以更方便使用功能,但不是必须的
4.系统也提供了其他方式,在不继承的情况下完成相同功能
5.如果是一个单词,首字母大写,比如 Index.php
6.URL访问时直接public/index即可
7.那么如果创建的是双字母组合,比如HelloWord
8.URL访问必须为public/hello-world
9.如果你想原样的方式访问URL,则需要关闭配置文件app.php中的自动转换
// 是否自动转换URL中的控制器和操作名
'url_convert' => true, //改成false
10.此时,URL访问可写为:public/HelloWorld
11.如果你想改变根命名空间app为其他,可以在根目录下创建.env文件
12.然后写上配对的键值对即可,app_namespace=application
在controller下创建一个HelloWorld,php
class HelloWorld
{
public function index()
{
return 'hello,world';
}
}
渲染输出
1.Thinkphp直接采用方法内return返回的方式直接就输出了
2.使用json输出,直接用json函数
$data=array('a'=>1,'b'=>2,'c'=>3);
return json($data);
3.采用view输出模板,开启错误提示,可知道如何创建模板
return view();
4.默认输出格式为html格式输出,如果返回的是数组,则会报错。
5.可以更改配置文件里的默认输出类型,更改为 json
return['user'=>'Lee','age'=>100];
// 默认输出类型
'default_return_type' => 'json',
public function arr()
{
$data=array('a'=>1,'b'=>2,'c'=>3);
return json($data);
}
public function abc()
{
return view();//会报错,模板文件不存在,c:...\view\index\abc.html
}
=>解决办法:
在application中创一个文件夹view,在view中创index文件夹,在index中加abc.html
6.一般来说,正常页面都是html输出,用于模板,AJAX默认是json.
7.如果继承了基类控制器,那么可以定义控制器的初始化方法
initialize();
8.initialize()方法会在调控制器方法之前执行
protected function initialize()
{
//parent::initialize();
echo 'init';
}
9.initialize()方法不需要任何返回值,输出用php方式,return无效,
1.继承controller类后可以设置一个$beforeActionlist属性来创造前置方法。
protected $beforeActionList=[
'first',
//one 方法执行不调用second,前置。
'second'=>['except'=>'one'],
//third前置只能通过调用one和two方法触发
'third'=>['only'=>'one,two'],
];
protected function first()
{
echo 'first<br/>';
}
2.此时我们可以分别URL访问不同的方法来理解前置的触发执行
重创一个Before.php
class Befor extends Controller
{
public function index()
{
return 'index';
}
protected $beforeActionList=[
'first',
'second'=>['except'=>'one'],//one方法执行不调用second前置
'third'=>['only'=>'one','two']
];
protected function first()
{
echo 'first</br>';
}
protected function second()
{
echo 'second';
}
protected function third()
{
echo 'third';
}
public function one()
{
return 'one';
}
public function two()
{
retunr 'two';
}
}
访问localhost/tp5.1/public/before/index
first
second
index
访问localhost/tp5.1/public/before/two
first
second
two
访问localhost/tp5.1/public/before/one
first
one
二.跳转和重定向
1.controller类提供2个跳转的方法,success(msg,url)和error(msg)
public function index()
{
if($this->flag){
//如果不指定url,则返回$-SERVER['HTTP_REFERE']
$this->success('成功!','../');
}
else
{
//自动返回前一页
$this->error('失败');
}
}
2.成功或错误有一个固定的页面模板: ‘thinkphp/tpl/dispatch_jump.tpl’;
3.在app.php配置文件中,我们可以更改自己个性化的跳转页面:
//默认跳转页面对应的模板文件
// 默认跳转页面对应的模板文件
‘dispatch_success_tmpl’ => Env::get(‘think_path’) . ‘tpl/dispatch_jump.tpl’,
‘dispatch_error_tmpl’ => Env::get(‘think_path’) . ‘tpl/dispatch_jump.tpl’,
protected $flag=true;
public function index()
{
if($this->flag)
$this->success('注册成功','../');
else
{
$this->error('失败');
}
return 'index;
}
如果是错误的,3秒后返回刚才的一页,即返回上层
4.如果需要自定义跳转页面,可以使用如下的模板变量
变量 | 说明 |
---|---|
$data | 要返回的数据 |
$msg | 页面提示信息 |
$code | 返回的code |
$wait | 跳转等待时间,单位为秒 |
$url | 跳转页面地址 |
三.空方法和空控制器
1.当访问了一个不存在的方法时,系统会报错,我们可以使用_empty()来拦截
public function _empty($name)
{
return '不存在当前方法'.$name;
}
2.当访问了一个不存在的控制器时,系统也会报错,我们可以使用Error类来拦截
在controller下创建一个Error.php
class Error
{
public function index(Request $request)
{
return '当前控制器不存在'.$request->controller();
}
}
3.系统默认为Error类,如果需要自定义,则在app.php配置文件中修改
// 默认的空控制器名
'empty_controller' => 'Error',
$m=M('User');//表名要大写非常重要
$arr=$m->select();//得到的是一个数组
$this->assign('data',$arr);//把一个二维数组分配给data
$this->display();//调用模板
模板可以遍历数组
//vo代表的是当前的数组,因为是二维数组按顺序读取。
<{$vo.id}>----<{$vo.username}>-----<{$vo.sex}>