MVC 패턴은 웹사이트 아키텍처에서 매우 일반적입니다. 이를 통해 코드에서 유용한 레이어를 분리하고 디자이너와 개발자가 함께 작업할 수 있도록 지원하며 기존 애플리케이션을 유지 관리하고 확장하는 능력을 향상시켜 3계층 애플리케이션을 구축할 수 있습니다.
보기
"보기"는 주로 스크립트에 의해 생성된 HTML과 같이 웹 브라우저에 보내는 최종 결과를 나타냅니다. 뷰에 대해 이야기할 때 많은 사람들이 템플릿을 떠올리지만, 템플릿 솔루션 뷰라고 부르는 것이 정확한지에 대해서는 의문이 듭니다.
아마도 뷰에 대해 가장 중요한 점은 뷰가 렌더링될 때 해당 요소가 더 큰 프레임워크에서 자신의 역할을 인식해야 한다는 것입니다.
XML을 예로 들면, XML이 구문 분석될 때 DOM API는 DOM 트리의 노드가 XML의 위치와 내용을 아는 지식을 갖고 있다고 말할 수 있습니다. (XML 문서의 노드가 SAX로 구문 분석되면 노드가 구문 분석될 때만 의미가 있습니다.)
대부분의 템플릿 구성표는 다음과 같은 간단한 절차적 언어와 템플릿 태그를 사용합니다:
<p>{some_text}</p >
<p>{some_more_text}</p>
문서에서는 아무런 의미가 없으며 PHP가 이를 다른 것으로 대체한다는 의미입니다.
뷰에 대한 이러한 느슨한 설명에 동의한다면 대부분의 템플릿 솔루션이 뷰와 모델을 효과적으로 분리하지 않는다는 데에도 동의하게 될 것입니다. 템플릿 태그는 모델에 저장된 내용으로 대체됩니다.
뷰를 구현할 때 스스로에게 몇 가지 질문을 해보세요. "전체 뷰를 교체하는 것이 쉬운가요?", "새 뷰를 구현하는 데 시간이 얼마나 걸립니까?", "뷰의 설명 언어를 교체하는 것이 쉬운가요?(예: 동일한 뷰에서 SOAP 사용 문서는 HTML 문서를 대체합니다."
모델(Model)
모델은 프로그램 논리를 나타냅니다. (엔터프라이즈 수준 프로그램에서는 비즈니스 계층이라고도 함)
일반적으로 모델의 작업은 원본 데이터를 뷰에 표시될 의미가 포함된 데이터로 변환하는 것입니다. 일반적으로 모델은 쿼리를 구현하기 위해 일부 추상 데이터 클래스(데이터 액세스 계층)를 통해 데이터 쿼리를 캡슐화합니다. 예를 들어, 영국의 연간 강수량을 계산하려는 경우(단지 좋은 휴가지를 찾기 위해) 모델은 10년 동안의 일일 강우량을 수신하고 평균을 계산한 후 뷰에 전달합니다.
컨트롤러(controller)는
단순히 컨트롤러가 웹 애플리케이션에서 들어오는 HTTP 요청의 첫 번째 부분임을 의미합니다. 일부 GET 변수와 같은 수신된 요청을 확인하고 적절한 피드백을 제공합니다. 첫 번째 컨트롤러를 작성하기 전까지는 다른 PHP 코드 작성을 시작하기가 어렵습니다. 가장 일반적인 사용법은 index.php의 스위치 문과 같은 구조입니다:
<?php
전환 ($_GET['viewpage']) {
사례 "뉴스":
$page=새로운 NewsRenderer;
부서지다;
사례 "링크":
$page=새로운 LinksRenderer;
부서지다;
기본:
$page=새로운 HomePageRenderer;
부서지다;
}
$페이지->디스플레이();
?>
이 코드는 절차적 코드와 객체 지향 코드를 혼합하지만 소규모 사이트의 경우 일반적으로 이것이 최선의 선택입니다. 위의 코드는 여전히 최적화될 수 있습니다.
컨트롤러는 실제로 모델의 데이터와 뷰 요소 간의 바인딩을 트리거하는 데 사용되는 컨트롤입니다.
예
다음은 MVC 패턴을 사용한 간단한 예입니다.
먼저 일반 클래스인 데이터베이스 액세스 클래스가 필요합니다.
<?php
/**
* MySQL 쿼리를 위한 간단한 클래스
*/
클래스 데이터 액세스 {
/**
*사적인
* $db는 데이터베이스 리소스를 저장합니다.
*/
var $db;
/**
*사적인
* $query는 쿼리 리소스를 저장합니다.
*/
var $query; // 리소스 쿼리
//!
/**
* 새로운 DataAccess 개체를 생성합니다.
* @param $host string dbserver의 호스트 이름
* @param $user 문자열 DB서버 사용자
* @param $pass string dbserver 사용자 비밀번호
* @param $db 문자열 데이터베이스 이름
*/
함수 DataAccess($host,$user,$pass,$db) {
$this->db=mysql_pconnect($host,$user,$pass);
mysql_select_db($db,$this->db);
}
//! 접근자
/**
* 쿼리 리소스를 가져와서 로컬 멤버에 저장합니다.
* @param $sql string 실행할 데이터베이스 쿼리
* @return 무효
*/
함수 가져오기($sql) {
$this->query=mysql_unbuffered_query($sql,$this->db); // 여기서 쿼리를 수행합니다.
}
//! 접근자
/**
* 쿼리 행의 연관 배열을 반환합니다.
* @return 혼합
*/
함수 getRow() {
if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
$행을 반환합니다.
또 다른
거짓을 반환;
}
}
?>
그 위에 모델을 올려주세요.
<?php
/**
* 데이터베이스에서 "제품"을 가져옵니다.
*/
클래스 ProductModel {
/**
*사적인
* $dao DataAccess 클래스의 인스턴스
*/
var $dao;
//! 생성자.
/**
* 새로운 ProductModel 객체를 생성합니다.
* @param $dbobject DataAccess 클래스의 인스턴스
*/
함수 ProductModel (&$dao) {
$this->dao=& $dao;
}
//! 조작자
/**
* 이 쿼리를 리소스로 저장하도록 $dboject에 지시합니다.
* @param $start 시작할 행 시작
* @param $rows 가져올 행 수
* @return 무효
*/
함수 listProducts($start=1,$rows=50) {
$this->dao->fetch("SELECT * FROM 제품 제한 ".$start.", ".$rows);
}
//! 조작자
/**
* 이 쿼리를 리소스로 저장하도록 $dboject에 지시합니다.
* @param $id 행의 기본 키
* @return 무효
*/
함수 목록제품($id) {
$this->dao->fetch("SELECT * FROM 제품 WHERE PRODUCTID='".$id."'");
}
//! 조작자
/**
* $dbobject에서 연관 배열로 제품을 가져옵니다.
* @return 혼합
*/
함수 getProduct() {
if ( $product=$this->dao->getRow() )
$제품을 반환합니다.
또 다른
거짓을 반환;
}
}
?>
한 가지 주목해야 할 점은 모델과 데이터 액세스 클래스 간의 상호 작용이 한 줄을 넘지 않는다는 것입니다. 여러 줄이 전송되지 않으므로 프로그램 속도가 빠르게 느려집니다. 동일한 프로그램은 스키마를 사용하는 클래스에 대해 메모리에 하나의 행(Row)만 유지하면 됩니다. 나머지는 저장된 쿼리 리소스(쿼리 리소스)에 제공됩니다. 즉, MYSQL이 결과를 유지하도록 합니다.
다음은 보기입니다. 공간을 절약하기 위해 HTML을 제거했습니다. 이 게시물에서 전체 코드를 확인할 수 있습니다.
<?php
/**
* 제품 데이터를 HTML 렌더링에 바인딩
*/
클래스 ProductView {
/**
*사적인
* $model은 ProductModel 클래스의 인스턴스입니다.
*/
var $모델
/**
*사적인
* $output 렌더링된 HTML은 표시를 위해 여기에 저장됩니다.
*/
var $output;
//! 생성자.
/**
* 새로운 ProductView 객체를 생성합니다.
* @param $model ProductModel 클래스의 인스턴스
*/
함수 ProductView(&$model) {
$this->모델=& $모델;
}
//! 조작자
/**
* HTML 페이지의 상단을 구성합니다.
* @return 무효
*/
함수 헤더 () {
}
//!
/**
* HTML 페이지의 하단을 구축합니다.
* @return 무효
*/
function footer () {
}
//!
/**
* 단일상품을 표시합니다.
* @return 무효
*/
함수 productItem($id=1) {
$this->모델->listProduct($id);
while ( $product=$this->model->getProduct() ) {
// 데이터를 HTML에 바인딩
}
}
//! 조작자
/**
* 제품 테이블 구축
* @return 무효
*/
함수 productTable($rownum=1) {
$rowsperpage='20';
$this->model->listProducts($rownum,$rowsperpage);
while ( $product=$this->model->getProduct() ) {
// 데이터를 HTML에 바인딩
}
}
//! 접근자
/**
* 렌더링된 HTML을 반환합니다.
* @return 문자열
*/
함수 표시 () {
$this->출력을 반환합니다.
}
}
?>
요약: MVC 패턴은 웹 사이트 아키텍처에서 매우 일반적입니다. 이를 통해 코드에서 유용한 레이어를 분리하고 디자이너와 개발자가 함께 작업할 수 있도록 지원하며 기존 애플리케이션을 유지 관리하고 확장하는 능력을 향상시켜 3계층 애플리케이션을 구축할 수 있습니다. 이 기사에서는 PHP에서 MVC 패턴을 구현하는 방법을 소개합니다.
태그: PHP MVC MVC 패턴 PHP 웹사이트
Oracle은 각 물류 링크에 대한 정확한 통찰력을 얻을 수 있도록 지원합니다.
Oracle은 각 물류 링크에 대한 정확한 통찰력을 얻을 수 있도록 도와줍니다. 마지막으로 컨트롤러인 뷰를 하위 클래스로 구현합니다.
<?php
/**
* 응용 프로그램을 제어합니다
*/
클래스 ProductController는 ProductView를 확장합니다.
//! 생성자입니다.
/**
* 새로운 ProductController 객체를 생성합니다.
* @param $model ProductModel 클래스의 인스턴스
* @param $getvars 수신 HTTP GET 메소드 변수
*/
함수 ProductController(&$model,$getvars=null) {
ProductView::ProductView($model);
$this->헤더();
스위치( $getvars['view'] ) {
"제품"의 경우:
$this->productItem($getvars['id']);
부서지다;
기본:
if ( 비어 있음 ($getvars['rownum']) ) {
$this->productTable();
} 또 다른 {
$this->productTable($getvars['rownum']);
}
부서지다;
}
$this->바닥글();
}
}
?>
이것이 MVC를 구현하는 유일한 방법은 아닙니다. 예를 들어 컨트롤러를 사용하여 모델을 구현하고 동시에 뷰를 통합할 수 있습니다. 이는 패턴을 보여주는 한 가지 방법일 뿐입니다.
index.php 파일은 다음과 같습니다:
<?php
require_once('lib/DataAccess.php');
require_once('lib/ProductModel.php');
require_once('lib/ProductView.php');
require_once('lib/ProductController.php');
$dao=& new DataAccess ('localhost','user','pass','dbname');
$productModel=& 새 제품모델($dao);
$productController=& 새 ProductController($productModel,$_GET);
echo $productController->display();
?>
아름답고 단순합니다.
컨트롤러를 사용하기 위한 몇 가지 요령이 있습니다. PHP에서는 다음과 같이 할 수 있습니다.
$this->{$_GET['method']}($_GET['param']);
한 가지 제안은 프로그램 URL 네임스페이스 형식을 더 잘 정의하는 것입니다. (네임스페이스), 그러면 더 표준화됩니다. 예:
"index.php?class=ProductView&method=productItem&id=4"
이를 통해 컨트롤러를 다음과 같이 처리할 수 있습니다:
$view=new $_GET['class'];
$view->{$_GET['method']($_GET['id']);
때로는 개발 속도와 적응성을 절충하는 경우와 같이 컨트롤러를 구축하는 것이 어렵습니다. 영감을 얻기에 좋은 곳은 컨트롤러가 완전히 XML 문서로 정의된 Apache 그룹의 Java Struts입니다.