2016-12-01 1 views
0

Slim3과 PHP를 사용하여 응용 프로그램 아키텍처에 대한 제한된 지식을 사용하여 프로젝트를 시작했습니다. 계획은 프로젝트를 만들고 응용 프로그램에 대한 우려를 분리하는 것이 었습니다. 모든 것이 잘 진행되었지만 응용 프로그램이 늘어남에 따라 상황이 혼란스러워졌습니다.리포지토리, 서비스 및 작업/컨트롤러 란 무엇입니까?

이 작업을 수행하는 모든 아이디어는 개발을 쉽게하기위한 것입니다. 그것은 어떤면에서는 효과가 있지만 데이터 흐름을 파악하는 것이 때때로 복잡하다는 것을 알게되었습니다.

리포지토리, 서비스 및 컨트롤러/작업에 대한 조언이 필요합니다. 그리고 그들이 시스템에서 어떻게 작동해야하는지. 그 중 나의 현재 이해는 다음과 같습니다 :

저장소는 서비스 계층 및 모델 층 사이에 사용되는

저장소. 예를 들어 UserRepository에서 데이터베이스에서 읽고 쓸 코드가 포함 된 메서드를 만들 수 있습니다. PHP에서는 PDO가 repo 메소드 내에서 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 (...) { ... } 
} 

작업

이 실제 용어입니다 있는지 확실하지 않습니다. 슬림 프레임 워크 문서에서 사용되었으며 씬 컨트롤러를 대표하는 것으로 보입니다.

조치에는 논리가 거의없고 서비스 호출을 위해 사용됩니다. 정당한 사유가없는 한 액션은 거의 리포지토리에 직접 전화하지 않습니다. 액션은 응답을 클라이언트에 다시 보내기 위해 서비스에서 반환 된 데이터에 대한 기본 검사를 수행합니다.

그들은 개별 노선에 묶여 있습니다. 나는 그들을 이렇게 사용하고있다 :

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

닫기가 너무 광범위하게 선정되었습니다. 나는 동의하지 않는다. 이러한 디자인 패턴을 사용하여 응용 프로그램을 설계 할 때는 일반적으로 하나의 정답만 있습니다. 예를 들어, 저장소를 사용하여 서비스를 사용하지 않을 것이고 그것은 나쁜 습관입니다. 나는 지식의 잠재적 격차로 인해 나쁜 습관으로 간주되는 일을 매우 잘 수행 할 수 있습니다. – BugHunterUK

+0

당신이하는 모든 것이 좋습니다 - 당신이 찾고 있던 대답 이었습니까?) –

+0

@ GeorgyIvanov 내 지식이 제한되어 있고 추측 작업이나 상식에 기반한 프로젝트가 많아서 프로젝트를 관리하는 동안 여전히 복잡함에 직면하고 있기 때문에 내가 어딘가에서 잘못하고 있다고 생각했습니다. – BugHunterUK

답변

2

이러한 패턴을 올바르게 사용하고 있습니까?

예, 그렇습니다. 제가 제공 할 수있는 일반적인 조언은 일반적인 수업이나 서비스에 너무 많은 책임을 부여하지 말아야한다는 것입니다 : 단일 책임 원칙을 따르십시오. 기본적으로 "내 수업은 변경해야 할 한 가지 이유가 있어야합니다"라고 나와 있습니다 (). 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

Slim은 패턴을 배우기위한 훌륭한 프레임 워크입니다. 실제로 애플리케이션의 아키텍처를 만들어야하기 때문입니다. 그리고 Yii는 건축 학적 모범 사례를위한 no-no입니다. –

+0

왜 안 되니? 그리고 제가 말씀 드렸듯이, 이것은 제안들입니다. 나를 위해 큰 프레임 워크를보고 패턴을 이해하는 것이 더 쉽습니다. 왜냐하면 종이에서가 아니라 제작 과정에서 어떻게 사용되는지를 알기 때문입니다. 연습이없는 이론은별로 도움이되지 않습니다. –

관련 문제