ThinkPHP8学习篇(三):控制器
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(){// 输出JSONreturn 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个方法。