我使用Slim3和PHP开始了一个使用有限的应用程序体系结构知识的项目。该计划是为了创建项目和单独的应用程序问题。这一切进展顺利,但随着应用程序的增长,事情变得非常混乱。什么是存储库,服务和操作/控制器?
这样做的整个想法是为了使开发更容易。它在某种程度上可以做到,但我发现有时候需要密切关注数据流。
我需要一些关于仓库,服务和控制器/操作的建议。以及他们应该如何在系统中工作。我目前的了解它们是下面:
库
库是服务层和模型层之间使用。例如,在UserRepository
中,您将创建包含从数据库读取/写入的代码的方法。在PHP中,在repo方法中将使用PDO或ORM。例如:
class UserRepository
{
public function findByID($id) { ... }
public function findByEmail($email) { ... }
public function findByMobile($mobile) { ... }
public function createEmail($email, $firstname, $lastname, $password) { ... }
public function createMobile($mobile, $firstname, $lastname, $password) { ... }
}
我已经提出了一些示例方法。但可能会有更多。
服务
服务层封装应用程序逻辑。例如,UserService
将负责创建帐户,并执行所需的逻辑以注册用户。服务也可以是第三方,例如为Facebook的SDK或ORM创建服务。
一个例子服务:
class UserService
{
public function createMobile($mobile, $firstname, $lastname, $password) {
/*
* Call a validation service to validate input
*/
...
/*
* Use UserRepository's findByMobile() to check if account exists
*/
...
/*
* Use UserRepository's createMobile() to create account
*/
...
/*
* Call SMS service to send verification code
*/
...
}
public function createEmail(...) { ... }
public function getFollowers (...) { ... }
}
操作
我不知道这是否是一个真正的术语。它在Slim Framework文档中使用,似乎代表了一个瘦控制器。
一个Action包含非常少的逻辑,用于调用服务。除非有正当的理由,否则Action很少会直接调用存储库。 Action将对从服务返回的数据执行基本检查,以便将响应发送回客户端。
他们绑定到个人路线。我正在使用它们:
class ActivateEmailAction extends Action {
public function __invoke(Request $request, Response $response, $args = [])
{
if(!$this->ci->ActivationService->activateEmail($args['token'])){
return $response->withJson([
'status' => 'error',
'data' => null,
'message' => 'Invalid verification token'
]);
};
return $response->withJson([
'status' => 'success',
'data' => null,
'message' => null
]);
}
}
我是否正确使用这些模式?我似乎采取的流程是这样的:
- 一切都从路线开始。例如,请求
/create
。路由被注册到一个Action。 - 行动决定调用何种服务
- 服务执行逻辑,使其他服务和存储库调用如果需要
- 服务手回数据
- 行动返回响应行动
任何建议将不胜感激。
我看到关闭已被选为过于宽泛。我不同意。使用这种设计模式设计应用程序通常只有一个正确答案。例如,你不会使用存储库中的服务,这是不好的做法。由于知识的潜在差距,我很可能会做一些被认为是不好的做法,这就是我问过的原因。 – BugHunterUK
你所做的一切都很好 - 是你寻找的答案吗? ) –
@GeorgyIvanov我的知识受到限制,其中很大一部分是基于猜测或常识,我认为在某些地方我做得不正确,因为我在管理项目时仍然面临一些复杂性。 – BugHunterUK