thinkphp笔记-控制器、数据库链接、模型

1258次阅读 70人点赞 作者: WuBin 发布时间: 2024-03-28 10:55:00
扫码到手机查看

控制器

控制器,即controller,控制器文件存放在controller 目录下;如果想改变系统默认的控制器文件目录,可以在config 下route.php 配置:

'controller_layer' => 'controller123',

在修改的同时,app/controller文件夹的名称也要对应的修改,改为:app/controller123才行。

文件基本结构

类名和文件名大小写保持一致,并采用驼峰式(首字母大写);

<?php
namespace app\controller;

class Test {
    public function index() 
    {
        return 'index不需要在url中体现';
    }

    public function hello($value = '')
    {
        return '123' . $value;
    }
}

并且index方法作为默认的方法,可以不需要在url中体现

http://localhost/xuexi/tp6/public/test/ 与下面链接等价

hhttp://localhost/xuexi/tp6/public/test/index

如果控制器文件名与类名都是驼峰写法时候,该如何访问这个方法?比如我们新建一个app/controller/HelloWorld.php

namespace app\controller;
class HelloWorld {
    public function index() {
        return 'index';
    }
}

可以直接访问:http://localhost/xuexi/tp6/public/helloworld 或者http://localhost/xuexi/tp6/public/hello_world

即直接全小写或者驼峰换小写,单词之间加下划线。

避免与model的冲突

一般注意命名空间就不会引起冲突,但是tp也提供了相应的避免的方法。在config/route文件中,修改:

'controller_suffix' => true, // 一般默认false即可

但是这么修改后,需要在app/controller中的文件,命名时候也要做相应的修改:

比如app/controller/Test.php =》app/controller/TestController.php

同样的,类名也要改:

class TestController (...)

返回输出

ThinkPHP 直接采用方法内return 返回的方式直接就输出了;即 return '123' => 页面直接打印123,如果要输出一个数组:

public function arrayOutPut() {
        $data = array('a'=>1, 'b'=>2, 'c'=>3);
        return json($data);
}

就要使用json方法,直接将数组转化为json,页面上会输出如下:

{
a: 1,
b: 2,
c: 3
}

助手函数halt、dump

不推荐使用die、exit 等传统PHP方法中断代码执行,推荐助手函数halt()。

halt('中断测试');
dump($变量) 可以打印出变量值以及其数据类型

基础控制器

一般来说,创建控制器后,推荐继承基础控制器来获得更多的方法;基础控制器仅仅提供了控制器验证功能,并注入了think\App 和think\Request;

使用基础控制器

namespace app\controller;
use app\BaseController;

class Test extends BaseController {...}

例如

class Test extends BaseController
{
    public function index() {
       //返回实际路径
       return $this->app->getBasePath();
       //返回当前方法名
        return $this->request->action();
     }
}

空控制器、报错控制器

在单应用模式下,我们可以给项目定义一个Error 控制器类,来提醒错误;

新建app/controller/Error.php,输入以下内容

<?php
namespace app\controller;

class Error {
    public function index() {
        return '当前控制器不存在';
    }
}

这时候,访问一个不存在的控制器,http://localhost/xuexi/tp6/public/ddd,就会直接输出error中定义的内容。

如果定义了此文件,那么无论.env中APP_DEBUG= true或false,都会按照error中定义的输出。

多级控制器

所谓多级控制器,就是在控制器controller 目录下再建立目录并创建控制器;

比如,新建app/controller/group(文件夹)/Blog.php,并在其中输入:

<?php
namespace app\controller\group;

class Blog {
    public function index() {
        return 'group index index';
    }

    public function read() {
        return 'group index read';
    }
}

如果要访问其read方法,那么应该如下操作:

http://localhost/xuexi/tp6/public/group.(点)blog/read

数据库基础

要链接数据库,应该首先更改配置文件:

本地开发环境,修改.env:

APP_DEBUG = true

[APP]
DEFAULT_TIMEZONE = Asia/Shanghai

[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1    本地
DATABASE = grade           数据库名称
USERNAME = root            用户名
PASSWORD = 123456       链接密码
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true

[LANG]
default_lang = zh-cn

而congfig/database中也有相关的数据库设置,这里的设置是针对于线上环境的,

 // 数据库连接配置信息
    'connections'     => [
        'mysql' => [
            // 数据库类型
            'type'            => env('database.type', 'mysql'),
            // 服务器地址
            'hostname'        => env('database.hostname', '127.0.0.1'),
            // 数据库名
            'database'        => env('database.database', 'grade'),
            // 用户名
            'username'        => env('database.username', 'root'),
            // 密码
            'password'        => env('database.password', '123456'),
            // 端口
            'hostport'        => env('database.hostport', '3306'),
在本地环境下,.env的优先级要大于config/database中的优先级。会优先采用.env文件中的配置,但是为了统一,直接都改成一样的。如果要在本地环境下测试config/database中数据库配置是否正确,只需要清空.env中的所有数据即可,清空后,就会默认采用config/database的配置。
本地环境下,最好config/app.php中的'show_error_msg'  =>true, 否则会有一些提示不会显示。

设置表前缀

 // 数据库表前缀
'prefix'          => env('database.prefix', 'tp_'),

表前缀意思就是假设数据库表名称:tp_user,那么在模型model中使用的时候我就不用输入tp_了,设置之后,前缀会自动给补上。比如,我在app/model/User.php中

namespace app\model;
use think\Model;

class User extends Model
{}

在控制器中使用时:

use app\model\User;

$user = User::select();

同时由于默认的.env文件中没有这个属性,所以也要补充上:

CHARSET = utf8
PREFIX = tp_
DEBUG = true

数据库类型type

在database.php 配置中,default 表示设置默认的数据库连接;

// 默认使用的数据库连接配置
'default'   => env('database.driver', 'mysql'),

这里的database.driver不正确,因为在.env文件中,采用的是TYPE= mysql,所以这里应该改为

'default' => env('database.type', 'mysql'),

能正常运行的原因就是采用了第二个参数值的默认值。

其中第二个参数是默认值,database.type对应的是.env文件中

[DATABASE]
TYPE = mysql
即指的是connections中的mysql字段指向的数据库。

切换数据库

connections 配置数据库连接信息,可以是多个数据库,便于切换;

'connections'     => [
    'mysql' => [
        ...
    ],

    'demo' => [
        ...
    ],

    // 更多的数据库配置信息
],

在实际应用的时候:

namespace app\controller;
use think\facade\Db;

class DataTest {
    public function index() {
        
        $user = Db::connect('mysql')->table('tp_user')->select();

        /*
        如果在配置信息中.env 中设置了TYPE = mysql 以及 config/dababase.php中设置了'default'=> env('database.type', 'mysql'),
        那么这里就可以省略链接数据库的步骤
        */
        $user = Db::table('tp_user')->select();

        return json($user);
    }
    
}

同样的如果要链接已经创建好的demo数据库中的表,我们可以如下:

 Db::connect('demo')->table('tp_user')->select();

模型基础

新建app/model文件夹,并新建User.php。

<?php
namespace app\model;
use think\Model;

class User extends Model
{
    // 如果要切换数据库,只需要设置一个受保护的属性,这里默认值是mysql,
// 同样的如果这里使用默认数据库mysql,那么这里什么都不用写就行,具体参考3.1的例子
// 这里指定要链接的数据库是demo
    protected $connection = 'demo';
}

User 继承模型基类,即可实现数据调用, 而受保护的字段$connection,则是切换到demo 数据库;

控制器中使用:

use app\model\User;

$user = User::select();
return json($user);

我很好奇模型类如何与数据表对应的,于是上网搜了搜,结果如下:

在ThinkPHP框架中,模型(Model)类对应着数据库中的一张表。要使模型类对应数据表,你需要遵循以下步骤:

  1. 创建模型类。

  2. 定义模型类的属性,与数据表中的字段对应

  3. 如果需要自定义数据表名称,可以在模型类中定义tableName属性或者在模型类的初始化方法_initialize()中设置。

下面是一个简单的模型类示例,该类对应数据库中的user表:

namespace Home\Model;
use Think\Model;
 
class UserModel extends Model {
    // 定义模型对应的数据表名称
    protected $tableName = 'user';
 
    // 如果不定义tableName,也可以在初始化方法中设置
    // protected function _initialize() {
    //     $this->tableName = 'user';
    // }
}
点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:thinkphp
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9664次阅读 631人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4342次阅读 322人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14542次阅读 951人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    13594次阅读 496人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    12136次阅读 971人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    16475次阅读 1315人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    15243次阅读 1240人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    30010次阅读 2359人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    26052次阅读 2003人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录