如何在service层实现密码哈希,让repository层仅负责数据存储
分层架构调整方案
按照service层承载业务逻辑、repository层仅负责数据持久化的职责划分,按以下步骤调整即可:
职责边界确认
- Service层:负责所有业务规则处理,密码哈希属于用户凭证处理的核心业务逻辑,放在本层实现
- Repository层:仅做数据的入库、查询等存储相关操作,不掺杂任何业务加工逻辑,接收处理完成的可直接持久化的数据
代码调整
1. 修改Service层文件 AdminService.php
在调用repository存储方法前,提前完成密码哈希处理,再把加工完成的数据传给repository:
public function createAdmin(array $data): RedirectResponse { // 业务逻辑:完成明文密码的哈希处理 $data['password'] = Hash::make($data['password']); // 调用仓储层完成纯存储操作 $createResult = $this->admin_repository->createAdmin(data: $data); // 可根据存储返回结果补充对应业务响应逻辑 if (!$createResult) { return back()->withErrors(['create_error' => '管理员创建失败,请稍后重试'])->withInput(); } return redirect('admins'); }
2. 修改Repository层文件 AdminRepository.php
移除层内的密码哈希逻辑,直接使用传入的已处理完成的字段值完成数据赋值与存储:
public function createAdmin(array $data): Admin|false { $admin = new Admin(); $admin->name = $data['name']; $admin->email = $data['email']; // 移除原Hash::make逻辑,直接使用service层处理后的密码值 $admin->password = $data['password']; try { $admin->save(); } catch (QueryException $e) { Log::error(trans('repository.admin.create_error') . $e->getMessage()); return false; } return $admin; }
调整收益
调整后完全符合单一职责原则:后续如果需要调整密码加密规则(比如更换加密算法、追加自定义盐值逻辑),仅需要修改service层代码即可,不需要改动底层存储逻辑;repository层也可以复用于批量导入管理员、初始化系统默认管理员等其他场景,不会和密码哈希这类特定业务逻辑强耦合。
内容的提问来源于stack exchange,提问作者samira
相关产品推荐
相关产品推荐

