2016-12-01 27 views
0

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 
     ]); 
    } 
} 

私はこれらのパターンを正しく使っていますか?私が採用したような流れはそうです:

  1. すべてがルートから始まります。例えば、/createへのリクエストが行われます。ルートはアクションに登録されます。
  2. アクションアクションレスポンスを返す
  3. アクションに戻ってデータを
  4. サービスの手を必要に応じて他のサービスとのリポジトリへの呼び出しを行う、
  5. サービスロジックを実行呼び出すためにどのようなサービスが決定し

どれでもアドバイスをいただければ幸いです。

+0

私はクローズがあまりにも広いと投票されていることを参照してください。同意しません。このようなデザインパターンを使用したアプリケーションの設計には、通常、正しい答えが1つしかありません。たとえば、リポジトリからのサービスを消費していないということは悪いことです。私は知識の潜在的なギャップのために悪い習慣とみなされることを非常にうまくやっている可能性があります。それが私が尋ねた理由です。 – BugHunterUK

+0

あなたがしていることはすべてうまくいきました - それはあなたが探していた答えでしたか? ) –

+0

@GeorgyIvanov私の知識は限られており、推測の仕事や常識に基づいていることの多くは、プロジェクトを管理しながら複雑さに直面しているため、私はそれを間違ってやっています。 – BugHunterUK

答えて

2

私はこれらのパターンを正しく使用していますか?

はい、あります。一般的なアドバイスは、一般的なクラスやサービスにはあまりにも多くの責任を与えることではありません。基本的には「私のクラスは変更する理由が1つしかありません」という単一責任の原則に従ってください( M.Fowler、私が覚えている限り、実際にはR. Martinだった、コメントのゴードンの修正のおかげで)。

あなたのUserServiceはあまりにも多くの異なるタスクを扱っているようです。それは、登録とフォローを処理します。おそらくSMSを送るでしょう。登録関連ロジックをUserRegistrationServiceクラスに抽出します。

+0

ああ、SRPに関する非常に良いアドバイス。私はしばしば、「これが最良の場所はどこに行くのか」を決めるときにしばしば立ち往生します。その結果、私はあまりにも多くのことをしているクラスを持っています。一般に、SRPに従うと、アプリケーションのクラス数が大幅に増えますか? – BugHunterUK

+0

@BugHunterUK、そうですが、まさにあなたがやることではありませんか? 「大きな神」のクラスを「より小さなクラス」のクラスに分割します。 )「多すぎるクラス」については、コードが論理的に整理されている限り、このような問題に遭遇することはまずありません。 –

-3

アプリケーション・アーキテクチャの限られた知識を持っている場合は、私は最初のデザインパターンについては、この本を読むことをお勧めします:http://amzn.eu/aNVH8Ii

第二の点は、スリムなフレームワークを使用することではありません。これは、ビルドしたいものとそれを行う方法をすでに知っている人々のための小さなフレームワークです。確かにパターンやアプリケーションのアーキテクチャを学ぶためのフレームワークではありません。私はYiiの2を見てみることをお勧めします

http://www.yiiframework.com/doc-2.0/guide-index.html

Yiiは、一般的に、今日の大きな用途で使用されているほとんどのデザインパターンとアーキテクチャソリューションを、使用し、学び、理解しやすいです。

+1

スリムは、実際にアプリケーションのアーキテクチャを作成する必要があるため、パターンを学習する優れたフレームワークです。 そして、Yiiは建築家のベストプラクティスのためのノー・ノーです。 –

+0

なぜですか?そして私が言ったように、これらは示唆です。私にとって、大きなフレームワークを見てパターンを理解するのは簡単です。なぜなら、それらが生産上ではなく紙面でどのように使われているかを見るからです。実践のない理論はそれほど役に立たない。 –

関連する問題