在 ThinkPHP 框架里,控制器起着至关重要的作用,它负责处理用户请求并返回响应结果。下面将全面介绍 ThinkPHP 控制器的使用方法,涵盖基础操作、高级特性以及实际应用场景。
控制器基础
1. 控制器定义
在 ThinkPHP 中,控制器一般存放在 app/controller
目录下。下面是一个简单控制器的示例:
php
namespace app\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
return 'Hello, ThinkPHP!';
}
public function hello($name = 'ThinkPHP')
{
return 'Hello, ' . $name;
}
}
2. 路由与控制器绑定
可以通过路由来指定要访问的控制器和操作方法:
php
use think\facade\Route;
// 基础路由绑定
Route::get('hello', 'Index/hello');
// 带参数的路由
Route::get('hello/:name', 'Index/hello');
3. 控制器命名规范
- 控制器类名采用大驼峰命名法,例如
UserController
。 - 操作方法名使用小写字母和下划线的组合,例如
get_user_list
。
控制器高级特性
1. 依赖注入
ThinkPHP 支持在控制器中进行依赖注入,像请求对象注入:
php
use think\Request;
class User extends Controller
{
public function info(Request $request)
{
$id = $request->param('id');
return 'User ID: ' . $id;
}
}
2. 控制器中间件
可以为控制器或者控制器中的特定方法应用中间件:
php
namespace app\controller;
use think\Controller;
use think\facade\Cache;
class User extends Controller
{
protected $middleware = [
'Auth' => ['except' => ['login']],
'Log' => ['only' => ['index', 'info']]
];
// 控制器方法...
}
3. 控制器初始化方法
在控制器中,可以定义初始化方法 initialize
,该方法会在其他操作方法执行前被调用:
php
class Base extends Controller
{
protected function initialize()
{
// 初始化操作,如验证用户身份
if (!session('user_id')) {
$this->error('请先登录', 'user/login');
}
}
}
响应处理
1. 返回不同类型的响应
php
class User extends Controller
{
public function index()
{
// 返回 JSON 数据
return json(['name' => 'John', 'age' => 30]);
// 返回视图
return view('user/index');
// 返回重定向
return redirect('user/login');
// 返回 XML
return xml(['status' => 'success']);
}
}
2. 页面跳转与消息提示
php
// 成功跳转
$this->success('操作成功', 'user/index');
// 错误跳转
$this->error('操作失败', 'user/add');
// 不跳转,显示消息
$this->message('提示信息');
RESTful 控制器
ThinkPHP 支持创建 RESTful 风格的控制器:
php
namespace app\controller;
use think\Controller;
use think\Request;
class Rest extends Controller
{
// GET 请求,获取资源列表
public function index()
{
return '获取资源列表';
}
// POST 请求,创建资源
public function save(Request $request)
{
return '创建资源:' . $request->param('name');
}
// GET 请求,获取单个资源
public function read($id)
{
return '获取资源 ID:' . $id;
}
// PUT 请求,更新资源
public function update(Request $request, $id)
{
return '更新资源 ID:' . $id;
}
// DELETE 请求,删除资源
public function delete($id)
{
return '删除资源 ID:' . $id;
}
}
控制器继承与基类
可以创建基类控制器,让其他控制器继承它,实现代码复用:
php
namespace app\controller;
use think\Controller;
class Base extends Controller
{
protected $user;
protected function initialize()
{
// 获取当前登录用户
$this->user = session('user');
}
}
// 继承基类
class User extends Base
{
public function profile()
{
return '用户资料:' . $this->user['name'];
}
}
控制器与模型交互
在控制器中,可以调用模型来处理数据:
php
namespace app\controller;
use think\Controller;
use app\model\User as UserModel;
class User extends Controller
{
public function index()
{
$users = UserModel::where('status', 1)->select();
return view('user/index', ['users' => $users]);
}
}
常用方法与属性
- 获取请求参数
php
$id = $this->request->param('id'); // 获取单个参数
$params = $this->request->param(); // 获取所有参数
$name = $this->request->post('name'); // 获取 POST 参数
- 文件上传
php
$file = $this->request->file('image');
if ($file) {
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if ($info) {
// 上传成功
} else {
// 上传失败
$this->error($file->getError());
}
}
- 控制器参数验证
php
public function add()
{
$data = $this->request->post();
$validate = validate('User');
if (!$validate->scene('add')->check($data)) {
$this->error($validate->getError());
}
// 验证通过,处理数据
}
总结
ThinkPHP 控制器是应用的核心组成部分,它负责处理业务逻辑并返回响应。通过合理运用控制器的特性,如依赖注入、中间件、RESTful 支持等,可以让代码更加简洁、可维护。