我正在尝试正确地删除我的代码,我希望你的意见。我可以在其他服务中拨打电话吗?
我在互联网上找到了简单的例子
这是我的架构:
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">
UserController的
public function store(StoreUserRequest $request)
{
$request->validated();
$this->userService->create(request()->except(['_token']));
return back()->with('success', 'created');
}
UserService
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;
}
}
编辑18/02/2019:
我有一个问题:如果我必须在我的控制器中使用单个服务,我如何在create方法中获取角色列表?
class UserController extends Controller {protected $ 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
以利用它的某些辅助函数。
即使在此示例中,两个服务一起使用,仍然每个服务仅根据其分配的域概念执行它所知道的内容。如果出现超出服务范围的内容,我们会调用相应的服务功能。希望有帮助......