第三章结尾
tp5比较灵活的3点
路由
获取参数变量
数据库查询(最灵活)
早晨电脑中毒了,重装后在新环境下偶然发现的问题
tp5在phpStudy虚拟路径下不能隐藏index.php
解决方法
修改配置.htaccess
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L](php fastcgi模式,服务器不识别PATH_INFO)
修改为
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
(来源:http://www.cnblogs.com/wangjiayi/p/7943268.html)
数据库设计
1.是否使用外键约束(保证数据的完整性和一致性)?
主要看自身的业务多少和数据库稳定等等决定。如果业务板块少,数据库结构稳定,那么用外键能好些。否则,可以不使用。(现在很少小公司业务变动较快,一般没有使用外键)
2.采用假删除
能很好的保护数据便于分析,且系统的稳定性和容错率会更高些。
3.设计表
初步想的越完善越好(根据自身经验和项目时间),迭代方式(一般会根据业务需求有所变更)
第四章 构建验证层
需要注意:强制路由需要规范书写,分大小写比较好,三段式(module/controller/action)
Route::get('banner/:id','api/v1.Banner/getBanner');//正确
验证 (独立验证,验证器)
客户端传过来的数据都是不可信的,需要过接口校验
内置验证规则
public function getBanner($id)
{
//需要验证的数据
$data = [
'name' => 'huisssssssssssssss',
'email' => 'hui@qq.com'
];
//验证规则
$validate = new Validate([
'name' => 'require|max:16',
'email' => 'email'
]);
$result = $validate->check($data);
//单一验证调试
echo $validate->getError();
}
public function getBanner($id)
{
//需要验证的数据
$data = [
'name' => 'huisssssssssssssss',
'email' => 'huiqq.com'
];
//验证规则
$validate = new Validate([
'name' => 'require|max:16',
'email' => 'email'
]);
// $result = $validate->check($data);
//批量验证(数组)
$result = $validate->batch()->check($data);
$err = $validate->getError();
var_dump($err);
}
验证器(官方推荐,封装性更好,简化代码)
<?php
namespace app\api\validate;
use think\Validate;
class TestValidate extends Validate
{
//受保护的 固定变量名rule
protected $rule = [
'name' => 'require|max:16',
'email' => 'email'
];
}
use app\api\validate\TestValidate; //必须引入
//验证器
$validate = new TestValidate();
自定义验证规则
当内置验证规则不满足时,可自定义优化
class IdIsInt extends Validate
{
protected $rule = [
'name' => 'require|max:16',
'email' => 'email',
'id' => 'require|isInteger'
];
protected function isInteger($value,$rule = '',$data = '',$field = '')
{
if (is_numeric($value) && is_int($value + 0) && ($value + 0) > 0) {
return true;
}
else{
return $field.'必须是正整数';
}
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public function getBanner($id)
{
//需要验证的数据
$data = [
'name' => 'huisssssssssssssss',
'email' => 'huiqq.com',
'id' => '0'
// 'id' => '1'
];
// 验证规则
// $validate = new Validate([
// 'name' => 'require|max:16',
// 'email' => 'email'
// ]);
//验证器
// $validate = new TestValidate();
//自定义验证
$validate = new IdIsInt();
// $result = $validate->check($data);
//批量验证(数组)
$result = $validate->batch()->check($data);
$err = $validate->getError();
var_dump($err);
}
20181230补充:
借助基类封装验证器,简化代码
<?php
namespace app\api\validate;
use think\Validate;
use think\Request;
use think\Exception;
class BaseValidate extends Validate
{
public function goCheck(){
$req = Request::instance()->param();
$result = $this->Check($req);
if (!$result) {
$err = $this->error;
throw new Exception($err);//tp5默认异常
}else{
return true;
}
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~
class IdIsInt extends BaseValidate
{
protected $rule = [
'name' => 'require|max:16',
'email' => 'require|email',
'id' => 'require|isInteger'
];
protected function isInteger($value,$rule = '',$data = '',$field = '')
{
if (is_numeric($value) && is_int($value + 0) && ($value + 0) > 0) {
return true;
}
else{
return $field.'必须是正整数';
}
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~
public function getBanner($id)
{
(new IdIsInt())->goCheck();
}
现阶段容易犯的一个错误,在不借助工具的情况下,跨控制器容易忘记引入控制器,还好现阶段的能看出异常,学会调试很重要。