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のドキュメントで使用されており、シンコントローラを表すようです。
アクションにはロジックがほとんど含まれていないため、サービスへの呼び出しに使用されます。正当な理由がない限り、アクションはリポジトリに直接コールすることはほとんどありません。アクションは、クライアントに応答を返すために、サービスから返されるデータの基本チェックを実行します。
これらは個別のルートに関連付けられています。私はそうそう使います:
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
へのリクエストが行われます。ルートはアクションに登録されます。 - アクションアクションレスポンスを返す
- アクションに戻ってデータを
- サービスの手を必要に応じて他のサービスとのリポジトリへの呼び出しを行う、
- サービスロジックを実行呼び出すためにどのようなサービスが決定し
どれでもアドバイスをいただければ幸いです。
私はクローズがあまりにも広いと投票されていることを参照してください。同意しません。このようなデザインパターンを使用したアプリケーションの設計には、通常、正しい答えが1つしかありません。たとえば、リポジトリからのサービスを消費していないということは悪いことです。私は知識の潜在的なギャップのために悪い習慣とみなされることを非常にうまくやっている可能性があります。それが私が尋ねた理由です。 – BugHunterUK
あなたがしていることはすべてうまくいきました - それはあなたが探していた答えでしたか? ) –
@GeorgyIvanov私の知識は限られており、推測の仕事や常識に基づいていることの多くは、プロジェクトを管理しながら複雑さに直面しているため、私はそれを間違ってやっています。 – BugHunterUK