2014-04-07 3 views
2

MVC 패턴을 따르는 MySQL 데이터베이스 기반 PHP (W) CMS 응용 프로그램을 만듭니다. 먼저 프레임 워크를 살펴보십시오. MVC 프레임 워크는 요청을 처리하고 URL을 기반으로로드/호출 할 대상을 결정합니다. http://domain.com/user/details/121User 컨트롤러 객체를로드하고 인스턴스화하며 userid가 0으로 전달 된 details(121) 메서드를 호출합니다. 매개 변수를 입력 한 다음 User_Model을 인스턴스화하고 121 사용자 ID를 사용하여 사용자의 세부 데이터를 묻고 마지막으로 결과를 View과 함께 표시하십시오. 이것은 MVC 아키텍처의 기본 개념입니다. 특별히이 시점에서 모든 것이 명확합니다.PHP의 프론트 엔드 페이지에 대한 URL 라우팅 패턴

반면 CMS가 될 것이므로 Page 모델을 처리하고 싶습니다. nesessary 권한 (주로 관리자 및/또는 루트)이있는 사용자는 예를 들어, 페이지의 기본 CRUD 작업 및 기타 물건을 수행 할 수 있습니다 내가있는 페이지를 만들 수 있습니다

  • 타일 = '회사 소개 '(예 : 예 : HTML 제목 및 h1 태그와 같은 페이지 제목 또는 브라우저 제목으로 표시됩니다.)
  • URL 이름 ='* about_us * '(URI 끝점과 같습니다. : http://domain.com/about_us)
  • 참조 이름 = '우리는 누구입니까?'(이것은 메뉴 바에 표시되는 텍스트입니다)
  • 페이지 내용 = '가 lorem ipsum의 ...'(다음은 WYSIWYG HTML을 텍스트 편집기로 페이지 ...의 실제 내용)
  • 과 아래에 하위 페이지를 지정하려면 페이지를 구성하는 등 더 많은 옵션 (I는 다음 http://domain.com 해당 페이지의 콘텐츠를로드 automaticall하는 시작 페이지로 '우리 소개 '을 설정하면 의미) 상위 페이지 또는 페이지 시작 페이지를 만들기 ...

아니면 이러한 속성을 수정할 수 있습니다, 심지어 내가 페이지를 삭제할 수 있습니다 ... 등.


MVC 프레임 워크는 프론트 엔드와 백엔드 호출을 처리하는 데 차이가 없습니다. 예를 들어 우리는 몇 가지 요청이 :

  • http://domain.com/user/details/121
  • http://domain.com/about_us
  • http://domain.com/our_products/1255

내가 전에 설명, 하지만 다른 사람들이 프론트 엔드 컨텐츠를로드와 같은 백엔드 컨트롤러를로드 할 첫 번째 .부트 스트랩은 위의 예에서, 우리는 실제 컨트롤러 파일을 찾아 적절한 컨트롤러/액션을로드 할 때 :

  • /controllers/Users.php
  • /controllers/About_us.php
  • /controllers/Our_products.php

첫 번째가 있기 때문에로드 할 수 있습니다 이전에 작성된 '정적'컨트롤러이지만 About_us 및 Our_products는 기존 컨트롤러가 아닙니다. 컨트롤러를로드 할 수없는 경우 부트 스트랩은 데이터베이스를 검색합니다. 같은 URL denimination (about_us, our_products와 같은)이있는 페이지가 있습니까? 존재한다면, 우리는 공통의 FrontEndController를로드하고 요청 된 페이지 데이터를 디스플레이한다. 그렇지 않다면, 404 에러를 디스플레이한다.

부트 스트랩이 모든 요청을 동일한 방식으로 처리하기를 원하지만 모든 프론트 엔드 URL에 강제로 FrontEndController (예 : http://domain.com/FrontEndController/our_products/1255)을 포함하고 싶지 않기 때문에이 작업을 수행합니다. 그래서 이것은 사용자로부터 숨기는 방법입니다. 따라서 URL은보다 사용자 친화적 인 상태로 유지 될 수 있습니다. 내 질문은 : 이것은 좋은 습관인가? 아니면 이것을 할 수있는 다른 적절한 방법이 있습니까?

+0

보내기 사용자가

  • Content-Type
  • 같은 파일을
  • 설정 HTTP 응답 헤더를 생성 OT 가져 오기 : 나는 당신이 희망 그들이 말하는 것처럼 * 다시 쓰지 않는 프레임 워크를 사용합니다. 그렇다면 라우팅을 구성하는 방법에 대한 도움말을 제공하기 위해 어느 것이 도움이되는지 알 수 있습니다. –

  • 답변

    0

    은 MVC 프레임 워크는 요청을 처리하고 URL

    당신이 일반적으로이되는 것입니다 것은 RouterDispatcher 클래스의 일종에 기반/전화를로드 할 것을 결정한다. 라우터는 user/details/121을 수락하고 구문 분석하고 Route을 반환합니다. 또한

    $router->addRoutes($routes); 
    

    사용자 지정 경로는 라우터에 사용자 정의 경로를 할 수 있습니다 추가 할 수 있습니다

    $route = $router->route($request->getUri()); 
    

    URI의 기본에 허용 된 공백 문자 등의 설정 값을 잡을 수 라우터 허용되는 문자 간단한 연관 배열

    $routes['requested-uri'] = 'custom-route' 
    

    위 예제에서 s 그들은 웹 사이트의 루트를 방문 할 때 도움 당신은이 같이 할 수 있도록 그들에게 실제로 저희 정보 페이지를보고 싶어 :

    $router->addRoutes([ 
        '' => 'about-us 
    ]); 
    

    의미 URI가 '때'(공백) 다음으로 이동 '에 대한 -us '경로. 리디렉션을해서는 안되며 클라이언트 웹 브라우저의 URI를 동일하게 유지하면서 다른 경로를 투명하게로드해야합니다.

    라우트 콜렉션에 추가 된 라우트 오브젝트를 사용하면 더 많은 제어를 통해보다 고급 사용자 정의 라우팅을 위해 라우팅이 분명히 더 복잡해 질 수 있습니다. 일부 프레임 워크는 유연한 라우팅을 달성하기 위해 주석과 다양한 종류의 다양한 방법을 사용합니다.

    발송자는 라우터에서 반환 된 경로를 수락하고 발송할 수 있습니다. 이는 요청 된 경로가 실제로 존재하는지, 즉 컨트롤러 파일이 존재하고 컨트롤러에 요청 된 메소드가 존재하는지 확인하는 것을 의미합니다.Dispatcher::Dispatch() 방법 내부

    $view = $dispatcher->dispatch($route); 
    

    는 :

    // Check if the controller file exists. 
    // Instantiate the controller file, preferably using a controller factory. 
    // Check if the controller method exists. 
    
    // Call the controller method 
    call_user_func_array([$controller, $route->getMethod()], $route->getParams()); 
    
    $view = $controller->getView(); 
    $action = $route->getAction(); 
    
    // Call the view method. 
    if(method_exists($view, $action)) { 
        $view->$action(); 
    } 
    
    return $view; 
    

    나는 컨트롤러 방법/행동을 다루는 다음은 이해하기 쉬운 방법을 찾을 수 있습니다. 로그인 컨트롤러가 있다고 가정 해 보겠습니다. 사용자가 먼저 폼에 GET 요청을 보내고 폼에 로그인 세부 정보를 보낼 때 POST 요청을 보냅니다.

    public function getIndex() { } 
    
    public function postIndex() { 
        $username = $this->request->post('username'); 
        $password = $this->request->post('password'); 
    } 
    

    이것은 당신이 그것은 또한 당신에게 허가를 세밀하게 제어 할 수 있으므로이

    public function index() { 
    
        if($this->request->getType() === 'POST') { 
         $username = $this->request->post('username'); 
         $password = $this->request->post('password'); 
        } 
    } 
    

    같은 것을 할 필요 방지, 메소드 이름 앞에포스트를 요청 유형입니다 얻을 (라우팅 계층에서 수행하는 경우) 사용자가 컨트롤러에 GET 요청을 보내도록 허용 할 수 있지만 POST 요청 전송에 대한 액세스를 거부 할 수 있기 때문입니다.

    각 컨트롤러에는보기와 일대일 관계가 있습니다. 뷰는 컨트롤러를 사용하여 건설 중에 컨트롤러에 주입됩니다.

    당신은 GET 요청 http://domain.com/user/details/121이 URI를 끊고 컨트롤러와 방법이 존재하는 경우 User 컨트롤러, 매개 변수 121getDetails() 방법, 발송자 확인을 대상으로 경로으로 바꿀 것 라우터 보낼 때 무슨 일이 일어날 것 그런 다음 사용자 ID를 제공하는 메소드를 인수로 호출하면 제어기는 사용자 ID를보기에 설정합니다. 아래 컨트롤러는 User입니다.

    public function getDetails($userId) { 
        $this->getView()->setUserId((int)$userId); 
    } 
    

    보기에는 details()이라는 메서드가 있습니다. 컨트롤러에서 호출 된 메소드와 동일한 이름. 요청 유형이없는 것입니다.

    그러면 Dispatcher는보기의 details() 메서드를 호출하여 필요한 데이터를 가져옵니다.

    페이지 제목 설정은 프리젠 테이션 목적으로 만보기에서 수행됩니다.

    당신이 setTitle 방법 모두보기 관련 물건은 당신에게 달려 이상을 구현하는 방법 사용자 컨트롤러

    public function details() { 
    
        // Fetch the user by using the previously set user ID from the controller. 
        // If he doesn't exist set an error template, set the response code to 404, 
        // or redirect. Do whatever you want really. 
    
        $this->setTitle('User Details'); 
    
        // Build template objects, bind the fetched user data to main template. 
    } 
    

    관련이 뷰의 일부입니다.

    뷰는 HTML 컨텐트, JSON, XML 또는 기타 컨텐트 유형이든 클라이언트에게 응답을 보냅니다.

    예를 들어, 응용 프로그램을 사용하여 사용자를 검색하고 Microsoft Excel 통합 문서 파일 (.xlsx)로 내보내고 사용자에게 다운로드하라는 메시지를 표시 할 수 있습니다.

    뷰는 다음과 같습니다

    • 는 응답
    +2

    "보기 : 사용자 가져 오기, 파일 생성, Content-Type과 같은 HTTP 응답 헤더 설정, 응답 보내기". 나는 너의 의견이 아니다 :)보기는 그렇게해서는 안된다. 컨트롤러는 UserModel에서 사용자 데이터를 가져옵니다. 컨트롤러는 파일을 생성하거나 서비스/도우미 객체를 사용하여 파일을 만듭니다. content-type은 응답 자체에 의해 설정되며 요청의 content-type을 평가합니다. 응답 개체가보기를 보냅니다. –

    +0

    자, 자원, 사용자가있는 경우 users.html, users.json, users.xlsx, users.xml을 방문하여 액세스 할 수 있어야합니다. 컨트롤러가 응답을 생성하면 HTML, JSON, XLSX 및 XML 응답을 생성해야합니다. 컨트롤러가 이미 너무 많은 작업을 수행하고 있기 때문에 엄청난 규모가 될 것입니다. 뷰는 데이터가 형식화되어 클라이언트로 다시 전송되는 곳이며, 자체 데이터를 가져와 이에 따라 응답을 생성합니다. 나는 당신이 그것을하는 방법을 사용했지만, 실제로 그것에 깊숙히 파묻혀있는 사람은 그것이 실제로 얼마나 잘못되었는지를 깨달았습니다. – ibanore

    관련 문제