ThinkPHP 支持传统的 MVC(Model-View-Controller)模式以及流行的 MVVM(Model-View-ViewModel)模式的应用开发,在请求流程中,控制器扮演着承上启下的核心角色 —— 它承接路由分发的请求,调度模型进行数据处理,协调视图完成最终渲染,是业务逻辑处理的中枢枢纽。本篇文章将记录 ThinkPHP 控制器的学习过程。
一、控制器定义
按照ThinkPHP的架构设计,所有的URL请求(无论是否采用了路由),最终都会定位到控制器。控制器的层可能有很多,为了便于区分就把通过URL访问的控制器称之为访问控制器(通常意义上我们所说的控制器就是指访问控制器)。ThinkPHP 的控制器定义比较灵活,可以无需继承任何的基础类,也或者根据业务需求封装自己的基础控制器类。
控制器文件默认放在 app\controller 目录下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。如果要更改控制器文件所在目录,需要在 config\route.php 配置文件中进行设置:
// 访问控制器层名称,可以更改为你需要的目录名称,默认为 controller
'controller_layer' => 'controller',
单应用模式控制器类的定义如下:
<?php
namespace app\controller;
class UserController
{
public function login()
{
return 'login';
}
}
控制器类文件的实际位置为 app\controller\UserController.php。
该类在没有定义路由的情况下也是可以访问的,访问的URL地址是:
http://servername/usercontroller/login
或者
http://servername/user_controller/login
可以看出,如果没有定义路由,访问的方式就是 类名/方法名。
1、渲染输出
控制器的输出默认全部采用 return 的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出。
下面我们来看一些常见的输出方式:
<?php
namespace app\index\controller;
class Index
{
public function hello()
{
// 直接输出字符串内容
return 'hello,world!';
}
public function json()
{
// 输出JSON
return json($data);
}
public function read()
{
// 渲染默认模板输出
return view();
}
}
控制器一般不需要任何输出,直接 return 就可以了。并且控制器在 json 请求时会自动转换为 json 格式输出。
二、基础控制器
默认安装后,ThinkPHP为我们提供了一个 app\BaseController 基础控制器类,官方建议我们在定义自己的控制器类时继承该类。当然,我们也可以对该基础控制器类进行修改。
基础控制器的位置可以随意放置,只需要注意更改命名空间即可。
基础控制器仅仅提供了控制器验证功能,并注入了 think\App 和 think\Request 对象,因此可以直接在控制器中使用 app 和 request 属性调用 think\App 和 think\Request 对象实例。
示例
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
// 继承 BaseController 后,就可以在方法中直接使用 app 和 request 属性
$action = $this->request->action();
$path = $this->app->getBasePath();
}
}
三、空控制器
空控制器从名字上看,应该是什么都不做的控制器,但实际上不是这样的。空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位当前应用下的空控制器(Error)类,利用这个机制我们可以用来定制错误页面和进行URL的优化。与其叫做空控制器,倒不如说是404更合适。
示例
<?php
namespace app\controller;
class Error
{
public function __call($method, $args)
{
return 'error request!';
}
}
四、资源控制器
资源控制器可以轻松创建 RESTFul 资源控制器,可以通过命令行生成需要的资源控制器,语法:
php think make:controller <资源控制器名称>
示例 创建 Blog 资源控制器
php think make:controller Blog
生成的资源控制器文件会自动放到 app\controller 目录下。
然后只需要为资源控制器注册一个资源路由:
Route::resource('blog', 'Blog');
设置后会自动注册7个路由规则,对应资源控制器的7个方法。