2009-07-13 2 views
0

지난 몇 주 동안 PHP를 사용하여 웹 응용 프로그램의 MVC 디자인 패턴을 연구했습니다. 넓은 시야를 통해 패턴이 어떻게 작동하는지, 왜 작거나 큰 웹 응용 프로그램을 구현하는 좋은 방법인지 이해합니다.MVC PHP 웹 응용 프로그램에서 컨트롤러 만들기 및 결합

내가 알고있는 것처럼 우리는과 같이 컨트롤러를 통해 서로 이야기 3 개 별개의 층이 있습니다

사용자 입력 --->보기 ---> 컨트롤러 ---> 모델

사이트 출력 < ---보기 < --- 컨트롤러 < --- 모델

내 계획된 구현으로는 내 데이터베이스의 각 테이블에 대한 모델을 갖기를 원하며 각 모델에는 관리에 필요한 모든 기능/논리가 있습니다. 이 테이블. 각 모델에는 차례대로 연관된보기가 있습니다. 모델과 뷰에는 물론 사용할 수있는 컨트롤러가 있습니다.

데이터베이스를 필요로하는 각각의 논리적 작업이 다뤄지면서 머리 글자를 익히기가 쉽습니다. 그러나 특정 작업에서 하나 이상의 테이블/모델을 사용해야하는 경우에는 어떻게됩니까?

응용 프로그램의 관리자 측에서 데이터베이스를 유지 관리하기 위해 한 번에 두 개 이상의 모델이 필요하지는 않습니다. 애플리케이션의 프런트 엔드 또는 사용자 측은 다른 문제입니다. 특정 섹션에 대한 기사 목록, 현재 로그인 한 사용자 목록 및 태그 클라우드와 같은 SO 사이트 통계의 예제를 빌려주는 웹 페이지가 있다고 가정 해보십시오.

이 한 페이지에는 아티클, 사용자 및 태그와 같은 계획된 디자인에 적어도 3 개의 모델이 필요합니다.

분명히 내 단일 컨트롤러가 그것을 자르지 않을 것입니다. 그래서 내가 뭘하니?

  1. 내 웹 페이지에 새로운 모노 리식 컨트롤러를 만드시겠습니까?

    • 나를 내가 원하는 결과를 얻을 수 있도록
    • 코딩 중복을 많이 필요로 변경
  2. 작은 조작하는 "슈퍼"컨트롤러를 만들기 필요한 경우 유지하기 위해 정말 열심히

  3. 특정 컨트롤러

    • 내가 원하는 결과를 얻을 수 있습니다.
    • ,
    • 는 모듈 것 때문에 하나의 스크립트 에 대한 변경 내가 현재쪽으로 실수를 범하고

[여기 확실한 해결책을 삽입] 만들기 다른 사람에게

  • 최소한의 코드 중복
  • 에 영향을 미치지 않습니다 옵션 2. 이론상으로 모든 필요한 동작이 더 작은 컨트롤러에 존재하기 때문에 코딩을 줄여야하기 때문에 모든 것이 유지 관리가 쉽습니다.

    아마도 다음과 같을 수 있습니다 :

    articlecontroller.php

    <?php 
        //Article Controller Script 
    
        if($_GET['article'] = 'foo') 
        { 
         //magic necessary for displaying article "foo". 
        } 
    ?> 
    

    usercontroller.php

    <?php 
        //User Controller Script 
    
        if($_GET['user'] = 'display') 
        { 
         //magic necessary for displaying users 
        } 
    ?> 
    

    supercontroller.php

    <?php 
        //"Super" Controller 
    
        //magic for setting up page 
    
        if(isset($_GET['article'])) 
        { 
         include('articlecontroller.php'); 
        } 
    
        if(isset($_GET['user'])) 
        { 
         include('usercontroller.php'); 
        } 
    ?> 
    

    본인의 수퍼 컨트롤러는 해당 특정 페이지가 필요로하는 것을 살펴본 다음 과감한 작업을 수행하는 데 필요한 컨트롤러를 포함합니다. NB : 코드는 단지 빠르고 빠 른 예일뿐입니다.

    그러나 나는 결코 프로가 아니므로, 저는 여러분에게 묻습니다. 어떤 옵션이 선호됩니까? 옵션 3이 아니라면 어떻습니까? 모든 코드 스 니펫/예제는 좋지만 필수는 아닙니다.

    지금까지 작성하신 경우 시간을내어 감사합니다. [및 답변을 받아 - 그렇게 깜빡 : P]를


    은 내가이 질문을 업데이트 할 거라 생각 했어요. 저는 Fat Models/Skinny Controllers의 개념을 살펴 봤습니다. 어떻게 완성 되었는가를 좋아합니다. 그래서 나는 확실히 그 방향을 취할 것입니다.

    다른 프레임 워크와 MVC 패턴을 얻는 방법에 대한 조언을 구했습니다. 받아들이는 것이 많습니다! 아직도, 나는 길을 따라 새로운 것들을 배웠다. 그래서 큰 도움이되었다. 앞으로 더 많은 질문을 할 수도 있지만, 지금은 시작하기에 충분합니다.

    입력 해 주셔서 감사합니다.

  • 답변

    6

    나는 당신이 당신의 모델에서 취하고 자하는 방향에 동의하지 않습니다. 1 모델 = 1 테이블 디자인은 장기적으로 당신을 해칠 것입니다.

    우선, 모델 == 데이터베이스라는 엄격한 개념을 삭제해야한다고 생각합니다. 이는 매우 사실이지만 사실 모델은 단지 데이터 일뿐입니다. XML 파일, 캐시 또는 웹 서비스에서 가져온 것일 수 있습니다.

    this excellent answerBill Karwin으로 확인하십시오.이 내용은 이러한 문제를 매우 잘 처리합니다.

    둘째, fat models, skinny controllers (또는 thin controllers)의 주제에 대한 몇 가지 독서를 할

    마지막으로, 단지 참고 더 같이 "supercontroller"당신의 생각은 "프론트 컨트롤러"

    로 더 일반적으로 알려진 것입니다
    +0

    그것은 아주 작은 프레임 워크이기 때문에, 1 모델 = 1 테이블은 대부분 꽤 잘 작동합니다. 그러나 어떤 모델은 하나 이상의 테이블을 필요로한다는 것을 알고 있으므로 완전히 제한하지는 않을 것입니다. 나는 자신의 PHP 프레임 워크 인 www.radicore.org를 개발 한 Tony Marston이라는 사람이 기사를 읽는 동안 약간의 시간을 보냈습니다. 그는 1 Model = 1 Table을 사용하는 것을지지하며, 그것은 내 자신의 디자인에 영향을 준 그의 아이디어이다. 그것은 그가 유일한 길임을 말하는 것은 아니지만 그는 매우 견고한 구조를 가지고 있으며 자신의 물건을 아는 사람입니다. – Etzeitet

    +0

    나는 그의 페이지에서 몇 가지 정보를 읽고 있는데 나는 모델에 대한 그의 의도를 오해한다고 생각한다. MVC의 그의 페이지에서 인용 한 내용은 "모델은 데이터 또는 활동 (예 : 데이터베이스 테이블 또는 일부 공장 생산 기계 프로세스)을 나타내는 개체입니다." –

    +0

    오, 오해하지 마세요. 나는 그가 "테이블 당 하나의 모델"만을 고집하지 않는다는 것을 알고 있지만, 계속 탐구한다면 그것은 눈에 잘 띄는 특징입니다. 어느 쪽이든 내가 이미 말했듯이 1 모델/1 테이블을 엄격히 고수 할 생각은 없지만 그렇게하는 것이 의미가있는 곳에서는 그렇게하지 않으면 아무런 문제가 보이지 않습니다. – Etzeitet

    2

    PHP MVC 프레임 워크를 살펴 보셔야합니다. 그들은이 모든 것들을 이미 알아 냈습니다. 그들은 URL 라우팅 (/ article/edit/1), 좋은 MVC 분리 및 훌륭한 문서를 통해 도움을받을 것입니다. 따라서 컨트롤러에서 뷰를 호출하는 방법에 대해 걱정할 필요없이 응용 프로그램에 대해 생각할 수 있습니다. 나는 개인적으로 톤을 저장할 때 마침내 다이빙을했다. Symfony

  • Codeigniter
  • CakePHP

    • Zend MVC framework (내 개인 좋아, 많이 또는 적게 당신이 필요로 사용)
    • 는 (나는 그것의 단단한 구조를 싫어하지만, 어떤 사람들은 그것을 숭배)

      많은 다른 사람들이 있습니다.

      처음부터 PHP MVC 프레임 워크를 만드는 것은 그럴만 한 가치가 없습니다. 당신이 바퀴를 재발 명하는 데에 죽었다면, 적어도 이러한 영감을 얻기위한 프레임 워크에 들어간 설계 고려 사항을 살펴 봐야합니다.

  • +0

    아하 저는 이것을 달성하기 위해 다른 프레임 워크가하는 일을 생각하지 않았습니다. 내 손을 더럽 히고 파고 들어야 할 때! 내 자신의 프레임 워크를 만드는 방법은 내가 할 수 있는지를 확인하는 개인 프로젝트입니다. 그것이 붕괴 되더라도 길을 따라 많은 것을 배워야합니다. :) – Etzeitet

    +0

    http://kohanaphp.com/을 잊지 마세요! – shadowhand

    1

    자신 만의 프레임 워크를 만드는 것은 디자인 패턴, 디자인 및 PHP에 대해 자세히 배우는 데 도움이됩니다.

    하지만 Byron은 mvc 패턴을 어떻게 구현했는지 알기 위해 일부 mvc 프레임 워크의 소스 코드를 제안하고 보았습니다. 젠드 프레임 워크에서 뭔가를 가져 와서 cakephp에서 뭔가를 가져 오면 결국 당신에게 도움이 될만한 것을 갖게되고 뭔가를 배웠을 것입니다 (참고 : 코드를 복사하지 말고 아이디어를 얻으십시오 !!)

    슈퍼 컨트롤러 아이디어는 괜찮지 만 저녁 식사 컨트롤러는 쿼리 문자열을 인수로 읽어야합니다 (Zend의 .htaccess와 그 방법을 확인하는 방법을 확인하십시오). 그래서 첫 번째 인수를 컨트롤러로 처리 할 수 ​​있습니다. 나머지는 그 컨트롤러에 대한 인수로.

    행운을 빌어 요 !!

    +1

    큰 MVC가 CodeIgniter 및 MicroMVC와 같은 작은 MVC는 MVC가 더 큰 프레임 워크가 추가되기 시작하는 모든 추가 쓰레기없이 어떻게 작동해야하는지 알게 될 때 정말로 도움이되는 것으로 나타났습니다. 그렇다면 일단 더 복잡한 프레임 워크 구현을 시작할 수 있습니다. 하지만 자신이 직접 빌드하려고 시도하기 전에 몇 가지 프레임 워크를 테스트해야합니다. 그것은 당신에게 많은 일을 줄 것입니다! – Xeoncross

    +0

    필자는 컨트롤러가 어떻게 작동하는지 구체적으로 구현하지 않았기 때문에 내가 준 예제 코드는 내가 얻었던 것의 가장 빠른 오프 - 더 - 어 헤드 - 오브 - 톱 (top-of-my-head) 예제였다. 그런 말로하면, 팁 주셔서 감사 : – Etzeitet

    관련 문제