Dai Chong's blog

关于trait之前可以说是完全没有了解过,看了官方文档之后才得知是php5.4的新特性,用来解决在不同结构(模块)下代码复用的问题.具体可以查看php手册
手册的介绍相对来说还是比较清晰的,那这篇文章就是为了献给那些不喜欢看文档,喜欢直接上手使用的童鞋.

首先介绍一下我的项目结构 我在Common模块下新建了一个文件traits 命名空间为 common/traits。

现在有多个模块需要使用相同的代码,那么就在traits下新建一个控制器,写入公用的代码

common/traits/ShopGoods.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
namespace \common\traits;
trait ShopGoods{
use \app\common\traits\ShopCommon;//这里是引用了其他的公共方法

//商品数据
private function goodsList($company_id,$hotel_id = NULL)
{
$post = input();

$post['company_id'] = $company_id;
$post['hotel_id'] = $hotel_id;

$post['my'] = isset($post['my'])??false;

$goods = new ShopGoodsM();

$model = $goods->alias('goods')
->leftJoin('shop_goods_category gcat','goods.id=gcat.goods_id')
->leftJoin('shop_category cat','gcat.category_id=cat.category_id')
->where('cat.deletetime',NULL);

if($post['my']){
$model->withSearch(['company_id','hotel_id'],$post);
}else{
$model->withSearch(['company_id'],$post);
}

$model->group('goods.id');
$list = $model->field("GROUP_CONCAT(DISTINCT(cat.name)) as category_name,goods.*")
->select();
//查询sku属性
foreach ($list as $key => $value) {
$list[$key]['sku'] = $goods->skus()->where('goods_id',$value['id'])->field('sku,price,stock,score')->select();
}
$total = $model->count();
return new Json([
'code' => 0,
'message' => 'success',
'data' => $list,
'total' => $total
]);
}
}
?>

那上边这块代码现在有Company和Hotel两个模块要使用:
company/index.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace company\controller;
class ShopGoods{
use \common\traits\ShopGoods;//引入公共的traits文件
//商品数据
public function getGoods()
{
return $this->goodsList(helper::getCompanyIdInCompany());
}

}
?>

这样的话Company和Hotel模块下只有写这两行代码就够了。

看到这里其实很多人会有疑问,说:这不和普通的代码公用是一个类型吗?
不不不!他们不一样,例如很多模块下的参数是无法公用的,company下的company_id在hotel模块下是无法调用的,但引入trait方法之后,你就可以在不同的模块下做参数处理,trait方法既可以通过默认参数的形式传递也可以接收post、get等方法的传递。
安全方面:trait方法不可直接通过接口访问、相比用公用的common方法做访问处理省事了很多!


 评论