控制器的后缀
打开配置文件application/app.php,有如下配置
// 应用类库后缀
\'class_suffix\' => false,
// 控制器类后缀
\'controller_suffix\' => false,
# 表示默认情况下,控制器无特殊后缀。例如 Index控制器,文件名为Index.php
如果需要进行设置,可以设置为
\'class_suffix\' => true,
\'controller_suffix\' => \'Controller\',
# 表示控制器以Controller为后缀。例如Index控制器,文件名为IndexController.php
注:一般不建议进行修改,保持默认,框架默认给我们的配置。
使用命令创建模块(分组)
命令格式:
php think build --module 模块名称
例:
php think build --module admin
创建控制器
创建控制器的方式有两种:
手动创建
application/模块目录/controller/目录下
命名规则:控制器名称(首字母大写) + (控制器后缀,默认没有) + .php
例:在application/index模块/controller/目录下,创建一个Demo控制器,访问输出demo/index
<?php
namespace app\\index\\controller;
use think\\Controller;
class Demo extends Controller {
public function index(){
return \'dmeo/index\';
}
}
注意:上面这种事pathinfo模式访问方法,需关闭强制路由设置,如果给这个控制器设置了路由则不用管
命令行方式创建【推荐】
创建标准控制器
如果模块目录不存在则会自动创建,所以创建控制器使用这个命令可以一步到位而不用使用上面的创建模块命令
php think make:controller --plain 模块名/控制器名
# 参数说明
--plain 标准控制器 (默认创建的控制器是一个资源控制器,所以一般加上此选项)
例:
在index模块下创建一个Demo2控制器
php think make:controller --plain index/Demo2
如果创建时,没有在模块名称,则默认创建到公共模块中 【common】
例:
php think make:controller --plain Demo
创建资源控制器
如果创建时,没有在命令中加入--plain
参数选项,则默认创建到公共模块中 【common】并且是资源控制器
资源控制器可以让你轻松的创建RESTFul
资源控制器,可以通过命令行生成需要的资源控制器,例如:
// 生成index模块的Blog资源控制器
php think make:controller index/Blog
或者使用完整的命名空间生成
php think make:controller app\\index\\controller\\Blog
例:
php think make:controller Demo2
如果加上模块名则会在该模块下创建资源控制器
例
php think make:controller index/Demo3
然后你只需要为资源控制器注册一个资源路由:
Route::resource(\'blog\',\'index/Blog\');
设置后会自动注册7个路由规则,如下:
请求类型 | 生成路由规则 | 对应操作方法 |
---|---|---|
GET | blog |
index |
GET | blog/create |
create |
POST | blog |
save |
GET | blog/:id |
read |
GET | blog/:id/edit |
edit |
PUT | blog/:id |
update |
DELETE | blog/:id |
delete |
前置操作方法
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作。
数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
例:访问index模块的Demo控制器的index或者welcome方法触发checkUser方法
<?php
namespace app\\index\\controller;
use think\\Controller;
class Demo extends Controller {
//前置操作方法列表 了解即可
protected $beforeActionList = [
//无值的话为当前控制器下所有方法的前置方法
\'first\',
//要触发的方法 => 请求的方法,请求此方法,触发前面定义的方法
\'checkUser\' => [\'index\',\'welcome\']
];
public function index(){
return \'dmeo/index\';
}
protected function first(){
echo \'first<br/>\';
}
//public 和 protected 修饰均可,为了不让外部访问一般使用protected
protected function checkUser(){
echo \'aaaa<br/>\';
}
public function welcome(){
return \'bbbb<br/>\';
}
}
页面跳转
在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\\think\\Controller
类内置了两个跳转方法success
和error
,用于页面跳转提示。
success 跳转
pathinfo方式
例:
<?php
namespace app\\index\\controller;
use think\\Controller;
class Demo2 extends Controller{
//
public function index(){
//pathinfo方式
//第一种写法
//return $this->success(\'登录成功\',\'/index/demo2/su\');
//第二种写法,同控制器使用tp提供的生成url地址函数
//同控制器下面可以直接写方法名 url(\'su\') 等价于\'/index/demo2/su\'
//return $this->success(\'登录成功\',url(\'su\'));
//第三种写法,不同控制器下面可以写控制器名/方法名
return $this->success(\'登录成功\',url(\'index/index\'));
}
//成功页面
public function su(){
return \'我是成功页面\';
}
}
自定义路由的方式
先在route\\route.php
文件中定义控制器路由
例:
//定义控制器路由 模块/类名/方法名 路由别名
Route::get(\'aaa\', \'index/index/index\')->name(\'indexr\');
然后在控制器中设置页面跳转
例:
//自定义路由
return $this->success(\'登录成功\',url(\'indexr\'));
error跳转
error跳转同样写法同样支持pathinfo和自定义路由的方式success的四种写法error跳转同样支持,下面只尝试一种
例:
<?php
namespace app\\index\\controller;
use think\\Controller;
class Demo2 extends Controller{
//
public function index(){
//错误
return $this->error(\'异常错误\',url(\'er\'));
}
//错误页面
public function er(){
return \'我是错误页面\';
}
}
ajax请求返回success 跳转数据
这两种方法可根据不同的请求方式(http标准请求还是ajax请求),自动返回数据(html/json)
例:
1. 在public
文件夹下创建ajax.html并写入ajax访问的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.js"></script>
</head>
<body>
<script>
$.get(\'/index/demo2/index\',{},data => console.log(data), \'json\');
</script>
</body>
</html>
2. 在控制器中返回访问成功
<?php
namespace app\\index\\controller;
use think\\Controller;
class Demo2 extends Controller{
//
public function index(){
return $this->success(\'登录成功\',url(\'index/index\'),[\'status\' => 1]);
}
}
运行结果