美文网首页
ThinkPHP 6 控制器和路由简说

ThinkPHP 6 控制器和路由简说

作者: 桂浮云 | 来源:发表于2020-04-09 20:44 被阅读0次

文/桂浮云,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,因此请预先在全局中间件中开启。

相关文章

网友评论

      本文标题:ThinkPHP 6 控制器和路由简说

      本文链接:https://www.haomeiwen.com/subject/wvqzphtx.html