모듈 / 플러그인을 지원하면서 MVC 프레임 워크를 어떻게 구성합니까? [닫은]


17

MVC 프레임 워크와 관련하여 본 두 가지 주요 코드베이스 구조가 있습니다. 문제는 둘 다 그들과 함께하는 조직적 버그가있는 것 같습니다.

표준 MVC

/controller
/model
/view

문제점 : 관련 구성 요소 (포럼, 블로그, 사용자 등)를 분리하지 않습니다.

모듈 식 MVC

/blog
    /controller
    /model
    /view
/user
    /controller
    /model
    /view
/forum
    /controller
    /model
    /view

모듈 기반 시스템을 선택하면 문제가 발생합니다.

  • 긴 이름 (Forum_Model_Forum = forum / model / forum.php) (Zend처럼)
  • 파일 시스템 is_file()에서 포럼 모델이있는 폴더를 찾기 위해 검색 합니까? (코 하나처럼)

다른 모듈을 분리하려고 할 때 다른 MVC 구조가 잘 작동합니까? 내가 누락 된 이러한 구조의 이점이 있습니까?


1
또한 PSR-0을 준수 하는 구조를 원 하므로 Zend 및 Doctrine과 같은 라이브러리를 필요한 경우 사용할 수도 있습니다.
Xeoncross

답변:


9

시험:

/blog 
    /controller
    /view
/user
   /controller
    /view 
/forum
    /controller
    /view
/model
    User
    BlogPost
    Comment
    ....

모델은 애플리케이션의 핵심입니다. 독립형 패키지로 디자인하고 코딩해야합니다. 컨트롤러는 모델의 클라이언트 일 뿐이며 사용자 활동을 모델의 조치로 변환합니다. 뷰는 모델의 데이터를 표시하는 특별한 방법 중 하나입니다. 응용 프로그램이 커지면 클라이언트를 모델에서 분리 할 수 ​​있습니다.

WebClient
    /blog 
        /controller
        /view
    /user
       /controller
        /view 
    /forum
        /controller
        /view
CommandLineClient
    delete_spam_posts_script
RestApiClient

/model
    User
    BlogPost
    Comment
    ....

이를 통해 여러 가지 클라이언트를 가질 수 있으며, 어떤 방식 으로든 단일 모델과 상호 작용할 수 있습니다.


MVC 구성 요소에 대한 설명과 작동 방식에 전적으로 동의하기 때문에 +1입니다. 그러나 모듈의 요점은 다른 사용자가 만든 모듈을 가져올 수 있으므로 모듈 경로 외부에 모델이 있으면 "끌어다 놓기"가 줄어 듭니다. 그러나 외부 플러그인이나 모듈을 사용하지 않는 응용 프로그램에는이 방법이 적합합니다.
제온 크로스

@Xeoncross는 사실, 여기서 재사용 성을 실제로 고려하지 않았습니다. 이것이 요구 사항이라면 실제로 한 단계 더 나아가 컨트롤러와 사용자 모델을 그룹화하는 '사용자'모듈과 컨트롤러와 블로그 포스트 및 댓글 모델을 그룹화하는 블로그 모듈을 가질 수 있습니다. 언제나처럼 : 그것은 문맥에 달려 있습니다 :-)
Mathias Verraes

2

;)

MVC / HMVC 프레임 워크를 결합한 최상의 구조를 찾았습니다. 메인의 경우 기본 컨트롤러 / 모델 / 뷰를 사용해야하지만 코스 모듈의 개별 구성 요소에는 ...

따라서 내 MVC / HMVC 프레임 워크 구조는 다음과 같습니다.

/application
  controllers/
  models/
  views/
  modules/
    blog/
      controllers/
      models/
      views/ 
    user/
      controllers/
      models/
      views/
    forum/
      controllers/
      models/
      views/

또한 모듈 라이브러리, i18n 또는 도우미를 추가 해야하는 경우.

컨트롤러 및 모델의 경우 이름 지정 규칙이 쉽습니다. 접미사 _Controller 및 _Model을 추가합니다. 모듈의 컨트롤러 및 모델의 경우 예를 들어 모듈 이름으로 접두사를 추가하십시오. 사용자 모듈의 컨트롤러 프로필 이름은 User_Profile_Controller로 지정됩니다.

따라서 필요한 것을 쉽게 찾을 수 있습니다.


1

문제 : 긴 이름 (Forum_Model_Forum)

클래스의 체계적인 이름 지정은 구성 요소 간의 이름 충돌을 피하는 데 도움이됩니다. 클래스의 긴 이름은 심각한 성능 저하를 초래하지는 않습니다. 이 명명 체계는 코딩 할 때 다소 도움이된다는 것을 알았습니다. 왜냐하면 어디에서 오는지 쉽게 알 수 있기 때문입니다.

파일 시스템 검색 (포럼 폴더가있는 폴더는 무엇입니까?)

이는 시스템 구현 방식에 따라 크게 다르지만 파일 시스템의 구조는 일반적으로 광범위한 파일 시스템 검색없이 올바른 구성 요소에 즉시 액세스 할 수있는 규칙을 따릅니다.

다음은 포럼 구성 요소가 사용되는 예입니다.

정보 :

  • 구성 요소 이름 : 포럼
  • 컨트롤러 이름 : index

    $ controller_path = BASEDIR입니다. 'module /'. $ component_name '/ controller /'. $ controller_name '.php';

또한 일반적인 웹 사이트를 부팅 할 때 말 그대로 수백 개의 파일 시스템 쿼리가 있으므로 일부를 추가해도 문제가되지 않습니다.


실제로 백엔드는 빠르게 시작해야하는 클라이언트 측 앱과 다르므로 런타임을 올바르게 구성하는 데 시간이 걸릴 수 있습니다. 좋은 지적.
패트릭 휴즈

0

첫 번째 "Standard MVC"로 시작한 웹 사이트를 작업했지만 결국 "Modular MVC"가되었습니다.

소규모 웹 사이트를 수행하고 있고 경험이 많지 않은 경우 "표준 MVC"로 시작하는 것이 좋습니다. 웹 사이트가 매우 복잡하고 크다는 것을 이미 알고 있다면 "Modular MVC"에 익숙해 져야합니다. 처음에는 약간 어려울 것입니다. 그러나 결국에는 그것.


0

실제로 프레임 워크를 직접 작업하고 있으며 모듈 기반 및 자유 형식 디렉토리 구조의 조합을 사용합니다. 프레임 워크를 사용하는 사이트 코드의 기본 구조는 다음과 같습니다.

/Configuration (stored a bunch ini files for security related information like passwords)
/Functions (stores file(s) with standard procedural functions)
/Libraries (general use classes)
/Models (all models go here)
/Modules (each module refers to one controller
/Modules/Site (controller class store in this folder if there is a controller)
/Modules/Site/Views (views for the controller)

또한 컨트롤러와 관련이없는 모듈 폴더를 가질 수 있으며 헤더 및 바닥 글과 같은 사이트 전체 템플릿을 저장하는 데 사용되는 기본 호출 Core가 있습니다. 나에게 이것은 두 세계의 최고를 제공합니다. 폴더 당 하나의 컨트롤러가 있기 때문에 컨트롤러의 위치를 ​​쉽게 알 수 있지만 모델과 같은 클래스의 경우 파일이 하나의 디렉토리 아래에있는 위치를 검색 할 필요가 없습니다 (모델의 이름을 더 깨끗하게 유지) .

파일을로드하는 방법은 사용자가 클래스가있을 수있는 위치에 다른 디렉토리를 구성 할 수 있으므로 조금 다릅니다. 처음에 디렉토리를 구문 분석하고 모든 클래스 파일 위치를 json 파일에 저장 한 다음 빠른 검색을 위해 사용하십시오 다른 모든 요청 (이를 개선하는 방법을 찾고 있지만).


0

이에 대한 대답은 모든 대형 시스템이 적응하기 시작했거나 지금 채택한 PSR-0 제안서 에 의해 지시되었습니다 .

구조는 다음과 같습니다.

\Doctrine\Common\IsolatedClassLoader => /Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request => /Symfony/Core/Request.php
\Zend\Acl => /Zend/Acl.php
\Zend\Mail\Message => /Zend/Mail/Message.php

이는 긴 파일 이름을 수정하기 위해 수행 할 수있는 작업이 없음을 의미합니다.

$controller = new \Blog\Controller\Archive => /Blog/Controller/Archive.php

/Blog
    /Controller
        Archive.php
    /Model
    /View
/User
    /Controller
    /Model
    /View
/Forum
    /Controller
    /Model
    /View

이것은 또한 모든 소문자 대신 벙어리 대소 문자 혼합 파일을 사용해야한다는 것을 의미합니다 (타사 라이브러리가 작동하지 않는 경우).


0

Mathiases 솔루션은 의미가 있습니다. 그의 폴더 구조를 사용한다고해서 플러그인 가능한 컨텐츠를 막을 수는 없습니다. 예를 들어 독립 / gallery /를 추가하면 다음과 같이 보일 수 있습니다.

WebClient
    /blog 
        /controller
        /view
    /user (uses /model/User/)
       /controller
        /view 
    /forum
        /controller
        /view
    /gallery
        /controller
        /view
        /model
CommandLineClient
    delete_spam_posts_script
RestApiClient

/model
    User
    BlogPost
    Comment

이제 필요한 경우 공유 된 "모델"과 독립적 인 모델이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.