我使用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