文/桂浮云,2020年4月8日
Thinkphp 6 框架同样采用了类MVC架构。M,即Model,模型;V,即View,视图;C,即Controller,控制器。先抛开M和V不说,单说Controller。除非您采用多应用模式,否则,您的对外的接口通常就在app/controller之下。默认会有一个Index.php文件,其中包含了public的index函数,也即默认的主页会在这个函数里进行处理。
这样说可能还有些模糊,但开发Web应用的时候,肯定需要有个大概的规划,比如对外提供哪些接口服务,哪些接口可以上传数据,哪些接口只需要发送数据给客户端。而且传送的数据是什么格式的,都需您自行设计。
假定您的域名为www.example.com。假定我们需要设计一个用户相关的控制器(app\controller\User),可以在app/controller目录先建一个User.php,然后添加add、edit、delete函数,以作为对用户进行增改删操作的接口:
//www.example.com/user/add ==>User::add()
//www.example.com/user/edit/:id ==>User::edit($id)
//www.example.com/user/delete/:id ==>User::delete($id)
示例代码可以是:
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Db; // 注意:tp6这里使用的是facade的Db
class User extends BaseController
{
public function add()
{
// 这里可以根据用户请求的方法确定是显示添加界面,还是处理提交的数据
if (strtolower($_SERVER['REQUEST_METHOD']) == 'get') {
// 这里使用了tp6的快捷函数view,\view('user/add')相当于查找位于app/view/user/add.html这个模板文件,返回客户端
return \view('user/add');
}
$time = time();
$data = [
'name' => input('name'),
'phone' => input('phone'),
// 这里简单把用户的创建时间作为种子和用户提交的密码一起做sha1哈希,是为了防止数据库泄露之后,密码同时泄露。这种安全意识是最基本的,一定要有。
'password' => sha1(input('password') . $time),
'time' => $time,
];
$data['id'] = Db::name('users')->insertGetId($data);
// 通过json快捷函数,可以直接把数组数据以json的形式反馈给客户端。
return \json($data);
// return '添加成功';
}
// 需要注意的是,由于delete函数带了参数,需要通过tp6的路由设置,对url链接进行参数转换
public function delete($id)
{
Db::name('users')-where('id', $id)->delete();
return '删除成功';
}
public function edit($id)
{
// 省略
}
}
关于用户删除的路由设置,可以在route目录下新建一个user.php(这样做是为了避免跟其他路由混淆,笔者建议一个控制器一个路由设置文件,如果需要的话)。具体的路由方法,可以参考官方教程相关资料
<?php
// route/user.php
// 这里需要注意的是,tp6不再允许返回数组,只能通过Route::<方法>进行相关设置
// 比如我们设置上面的用户delete路由
use think\facade\Route;
// 用户删除,仅可以通过get方法进行调用。
// 注意:由于可以通过浏览器的地址栏直接调用,使得用户数据很容易被删除,这样做非常不安全!!!建议增加表单令牌等形式的额外验证。这里仅为示范!!!
Route::get('user/delete/:id', 'issue/delete');
// 用户编辑。任意get、post等方法都可以
Route::any('user/edit/:id', 'issue/edit');
如果您习惯采用RESTFUL的方式进行控制器接口设计,TP6也是支持的,可以参照资源路由有关内容设置路由,同时实现对应的路由接口对应的函数。
另外,表单令牌需要使用session,因此请预先在全局中间件中开启。
网友评论