一.灵活的路由
路由定义采用\think\Route类的rule方法注册,通常是在应用的路由配置文件application/route.php进行注册,格式是:
Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
use think\Route;
// 注册路由到index模块的News控制器的read操作
Route::rule('new/:id','index/News/read');
二.获取前端请求的三种方式
- 获取当前的请求信息,可以使用\think\Request类,
$request = Request::instance();
获取PARAM变量
PARAM变量是框架提供的用于自动识别GET、POST或者PUT请求的一种变量获取方式,是系统推荐的获取请求参数的方法,用法如下:
// 获取当前请求的name变量
Request::instance()->param('name');
// 获取当前请求的所有变量(经过过滤)
Request::instance()->param();
// 获取当前请求的所有变量(原始数据)
Request::instance()->param(false);
// 获取当前请求的所有变量(包含上传文件)
Request::instance()->param(true);
获取GET变量
Request::instance()->get('id'); // 获取某个get变量
Request::instance()->get('name'); // 获取get变量
Request::instance()->get(); // 获取所有的get变量(经过过滤的数组)
Request::instance()->get(false); // 获取所有的get变量(原始数组)
获取POST变量
Request::instance()->post('name'); // 获取某个post变量
Request::instance()->post(); // 获取经过过滤的全部post变量
Request::instance()->post(false); // 获取全部的post原始变量
获取Cookie变量
Request::instance()->cookie('user_id'); // 获取某个cookie变量
Request::instance()->cookie(); // 获取全部的cookie变量
- 自动注入请求对象
在控制器的架构方法中会自动注入当前请求对象
操作方法注入
namespace app\index\controller;
use think\Request;
class Index
{
public function hello(Request $request)
{
return 'Hello,' . $request->param('name') . '!';
}
}
- 助手函数
获取PARAM变量
input('param.name');
input('param.');
或者
input('name');
input('');
获取GET变量
input('get.id');
input('get.name');
input('get.');
获取POST变量
input('post.name');
input('post.');
三.模型
orm对象关系映射,可以把数据表想象为一个类,字段为类的属性,对象就是表中的一个记录。
- 调用方式
- 静态调用
$user = User::get(1);
$user->name = 'thinkphp';
$user->save();
- 实例化对象调用
// 实例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();
推荐方式是静态调用,我认为符合面向对象的编程思想,类对应一张表,每个对象就是表中一个记录,类来获取一条记录相当于表中获取一条记录。
获取单个数据的方法
取出主键为1的数据
$user = User::get(1);
echo $user->name;
- 获取器和修改器
获取器的作用是在获取数据的字段值后自动进行处理,例如,我们需要对状态值进行转换,可以使用:
class User extends Model
{
public function getStatusAttr($value)
{
$status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
return $status[$value];
}
}
数据表的字段会自动转换为驼峰法,一般status字段的值采用数值类型,我们可以通过获取器定义,自动转换为字符串描述。
$user = User::get(1);
echo $user->status; // 例如输出“正常”
修改器的作用是可以在数据赋值的时候自动进行转换处理,例如:
class User extends Model
{
public function setNameAttr($value)
{
return strtolower($value);
}
}
如下代码实际保存到数据库中的时候会转为小写
$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->name; // thinkphp
- 一对一关联
hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');
namespace app\index\model;
use think\Model;
class User extends Model
{
public function profile()
{
return $this->hasOne('Profile');
}
}
一对多关联
hasMany('关联模型名','外键名','主键名',['模型别名定义']);
例如一篇文章可以有多个评论
hasMany('Comment');
}
}
多对多关联
belongsToMany('关联模型','中间表','外键','关联键');
例如,我们的用户和角色就是一种多对多的关系,我们在User模型定义如下:
belongsToMany('Role');
}
}
四.日志
- 日志初始化
在使用日志记录之前,首先需要初始化日志类,指定当前使用的日志记录方式。
Log::init([
'type' => 'File',
'path' => APP_PATH.'logs/'
]);
上面在日志初始化的时候,指定了文件方式记录日志,并且日志保存目录为APP_PATH.'logs/'
-
日志级别
ThinkPHP对系统的日志按照级别来分类,并且这个日志级别完全可以自己定义,系统内部使用的级别包括:- log 常规日志,用于记录日志
- error 错误,一般会导致程序的终止
- notice 警告,程序可以运行但是还不够完美的错误
- info 信息,程序输出信息
- debug 调试,用于调试信息
- sql SQL语句,用于SQL记录,只在数据库的调试模式开启时有效
Log::error('错误信息');
Log::info('日志信息');
// 和下面的用法等效
Log::record('错误信息','error');
Log::record('日志信息','info');
还封装了一个助手函数用于日志记录,例如:
trace('错误信息','error');
trace('日志信息','info');
也支持指定级别日志的输入,需要配置信息:
'log' => [
'type' => 'File',
// 日志记录级别,使用数组表示
'level' => ['error'],
],