laravel - laravel 服务使用模型和服务
问题描述
我正在尝试正确地削减我的代码,我想听听你的意见。我可以在另一个服务中调用一个服务吗?
我在网上找到了一些简单的例子
这是我的架构:
UserController
UserService
User
Fields => id, name
AliasController
AliasService
Alias
Fields => id, user_id, name
1个用户有很多别名如果没有定义别名,则生成
形式
<input type="text" name="name">
<input type="text" name="alias">
用户控制器
public function store(StoreUserRequest $request)
{
$request->validated();
$this->userService->create(request()->except(['_token']));
return back()->with('success', 'created');
}
用户服务
class UserService
{
protected $user;
protected $alias;
public function __construct(User $user, AliasService $aliasService)
{
$this->user = $user;
$this->alias = $alias;
}
public function create(array $attributes)
{
// create user
$user = $this->user->create($attributes);
// create or generate alias
if (isset($attributes['alias'])) {
$aliasName = $attributes['alias'];
} else {
$aliasName = $this->aliasService->generate($user->name);
}
$this->aliasService->create([
'user_id' => $user->id,
'alias' => $aliasName
]);
return $user;
}
}
编辑 2019 年 2 月 18 日:
我有一个问题:如果我必须在我的控制器中使用单个服务,我如何在 create 方法中获取角色列表?
类 UserController 扩展控制器 { 保护 $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function create()
{
$user = new User();
$roles = Role::all(); <= ???
or
$roles = $this->roleService->getAll(); <= ???
return view('users.create', array(
'user' => $user,
'roles' => $roles
));
}
}
解决方案
我觉得当你想分离一个涉及模型创建更新功能的逻辑时,你可以使用Repository
概念。本质上只是一个处理特定模型上发生的动作的类。
服务更像是专用于特定领域概念的类。服务的目的是提供帮助函数来处理服务所代表的领域概念。
为了简化,例如:
您可能有一个用户模型。每个用户都可以获取他的 facebookfeeds。他也可以报名参加小组讨论。在这种情况下,您可以拥有 2 项服务:
FacebookService
它会处理您需要的与 facebook 发布相关的所有操作。
DiscussionService
它会处理您需要的与小组讨论相关的所有操作。
现在,您可能希望在讨论中添加一项功能,以便在 facebook 上发布最近的讨论。这意味着 DiscussionService
可以在内部访问FacebookService
以利用它的某些辅助功能。
即使在此示例中,两个服务一起使用,但每个服务仍然只根据分配给它的域概念做它所知道的事情。如果出现超出服务范围的内容,我们将调用相应的服务函数。希望有帮助...
推荐阅读
- python - 如何将此 PHP MYSQL 函数转换为 Python
- html - flex容器内的css文本交换出错
- java - Java, removing objects in one method from an array list value of treemap
- youtube-data-api - YouTube API takes minutes now - instead of seconds
- php - 如何配置 phpmailer 以使用代理发送邮件?
- html - 为什么会有 HTML5”
" 在我的 EJS 布局中生成的标签?
- python - 在 python 中跟踪路由实现
- javascript - d3按路径动画组
- c++ - 根据单个任务的时间需求动态创建线程
- reactjs - 隐藏组件以在 React 中保持其状态