什么是存储库、服务和 Actions/Controllers?
What are Repositories, Services, and Actions/Controllers?
我使用 Slim3 开始了一个项目,PHP 我对应用程序架构的了解有限。计划是创建项目并分离应用程序关注点。一切顺利,但随着应用程序的增长,事情很快变得混乱。
这样做的全部想法是让开发更容易。它在某种程度上确实如此,但我发现有时要密切关注数据流很复杂。
我需要一些关于存储库、服务和 Controllers/Actions 的建议。以及它们应该如何在系统中工作。我目前对它们的理解如下:
存储库
存储库用于服务层和模型层之间。例如,在 UserRepository
中,您将创建包含来自数据库的 read/write 代码的方法。在 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 很少直接调用存储库。该操作将对从服务返回的数据执行基本检查,以便将响应发送回客户端。
它们与个别路线相关联。我是这样使用它们的:
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。
- 操作决定调用什么服务
- 服务执行逻辑,根据需要调用其他服务和存储库
- 服务将数据交还给操作
- 行动returns回应
如有任何建议,我们将不胜感激。
如果你对应用程序架构的了解有限,我建议你先阅读这本关于设计模式的书:http://amzn.eu/aNVH8Ii
第二点是不要使用slim框架。对于已经知道自己想要构建什么以及如何构建的人来说,它是一个小型框架。绝对不是学习任何模式或应用程序架构的框架。
我建议看一下 Yii 2:http://www.yiiframework.com/doc-2.0/guide-index.html
Yii 使用了当今大型应用程序中常用的大多数设计模式和架构解决方案,并且易于学习和理解。
Am I using these patterns correctly?
是的,你是。我给出的一般建议是不要给你的一般 classes 和特别是服务太多的责任:遵循单一责任原则,这基本上说明 "my class should have only one reason to change" ( 那是 M.Fowler,据我记得 实际上是 R. Martin,多亏了 Gordon 在评论中的更正)。
您的 UserService
似乎要处理太多不同的任务:它处理注册和吸引关注者。并且可能会发送短信。将注册相关逻辑提取到UserRegistrationService
class.
我使用 Slim3 开始了一个项目,PHP 我对应用程序架构的了解有限。计划是创建项目并分离应用程序关注点。一切顺利,但随着应用程序的增长,事情很快变得混乱。
这样做的全部想法是让开发更容易。它在某种程度上确实如此,但我发现有时要密切关注数据流很复杂。
我需要一些关于存储库、服务和 Controllers/Actions 的建议。以及它们应该如何在系统中工作。我目前对它们的理解如下:
存储库
存储库用于服务层和模型层之间。例如,在 UserRepository
中,您将创建包含来自数据库的 read/write 代码的方法。在 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 很少直接调用存储库。该操作将对从服务返回的数据执行基本检查,以便将响应发送回客户端。
它们与个别路线相关联。我是这样使用它们的:
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。 - 操作决定调用什么服务
- 服务执行逻辑,根据需要调用其他服务和存储库
- 服务将数据交还给操作
- 行动returns回应
如有任何建议,我们将不胜感激。
如果你对应用程序架构的了解有限,我建议你先阅读这本关于设计模式的书:http://amzn.eu/aNVH8Ii
第二点是不要使用slim框架。对于已经知道自己想要构建什么以及如何构建的人来说,它是一个小型框架。绝对不是学习任何模式或应用程序架构的框架。
我建议看一下 Yii 2:http://www.yiiframework.com/doc-2.0/guide-index.html
Yii 使用了当今大型应用程序中常用的大多数设计模式和架构解决方案,并且易于学习和理解。
Am I using these patterns correctly?
是的,你是。我给出的一般建议是不要给你的一般 classes 和特别是服务太多的责任:遵循单一责任原则,这基本上说明 "my class should have only one reason to change" ( 那是 M.Fowler,据我记得 实际上是 R. Martin,多亏了 Gordon 在评论中的更正)。
您的 UserService
似乎要处理太多不同的任务:它处理注册和吸引关注者。并且可能会发送短信。将注册相关逻辑提取到UserRegistrationService
class.