php
复制代码
// 原则,所有服务类只有一个public入口,或者多个public入口,但是他们做都是同一件事情
Class CreateService {
// 创建类的入口, 根据dto去新建
public function create(Dto $dto){
// 先构建model对象, 不要在事务期间构建,减少事务等待
$good = $this->buildGood($designProduct, $dto);
$good->setRelation('aList', $this->buildAList($dto));
$good->setRelation('bList', $this->buildBList($dto));
DB::transaction(function () use (
$good
) {
// 保存model对象
// 主表
$good->save();
// 主表关联其他表
$good->aList()->saveMany(
$designReference->aList->all()
);
// 主表关联其他表
$good->bList()->saveMany(
$designReference->bList->all()
);
// 触发事件,要delay延迟事件,确保事务提交后触发
delay_event(new GoodCreated());
});
}
// 根据product类去新建
public function createByProduct(Product $product) {
// build reference
// save()
}
/**
* @param Dto $dto
* @return Collection
*/
protected function buildAList(
Dto $dto
): Collection {
$newCollection = new Collection();
$$list = array_filter_unique(explode(',', $dto->getName()));
if (empty($list)) {
return $newCollection;
}
foreach ($list as $name) {
$newCollection->add(new GoodAList([
'name' => $name,
]));
}
return $newCollection;
}
protected function buildBList(
Dto $dto
): Collection {
$newCollection = new Collection();
if (!empty($dto->getBName())) {
$newCollection->add(
new GoodBList(
[
'country_name' => $dto->getBName(),
]
)
);
}
return $newCollection;
}
/**
* @param Product $product
* @param Dto $dto
* @return Good
*/
protected function buildGood(
Product $product,
Dto $dto
): Good {
return new Good([
'updated_at' => $dto->getDataUpdatedAt(),
'band_id' => $product->band_id,
]);
}
}
$service = new CreateService();
$service->create();