thinkphp笔记-控制器、数据库链接、模型
控制器
控制器,即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)类对应着数据库中的一张表。要使模型类对应数据表,你需要遵循以下步骤:
创建模型类。
定义模型类的属性,与数据表中的字段对应。
如果需要自定义数据表名称,可以在模型类中定义
tableName
属性或者在模型类的初始化方法_initialize()
中设置。
下面是一个简单的模型类示例,该类对应数据库中的user
表:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
// 定义模型对应的数据表名称
protected $tableName = 'user';
// 如果不定义tableName,也可以在初始化方法中设置
// protected function _initialize() {
// $this->tableName = 'user';
// }
}