참고 : Robert C. Martin (일명 Bob Uncle Bob)은 그의 기조 연설 인 Architecture the Lost Years 에서이를 훨씬 더 유머러스하게 설명합니다 . 조금 길지만 좋은 개념을 많이 가르칩니다.
tl; dr : MVC와 관련하여 앱을 생각하고 계획하지 마십시오. MVC 프레임 워크는 구현 세부 사항 일뿐입니다.
MVC의 가장 혼란스러운 점은 개발자가 서로 붙어있는 모든 구성 요소를 사용하려고한다는 것입니다.
프레임 워크의 관점이 아닌 프로그램의 관점에서 생각하십시오.
당신의 프로그램은 목적이 있습니다. 데이터를 가져 와서 데이터를 처리하고 일부 데이터를 반환합니다.
그렇게하면 controller
프로그램의 전달 메커니즘이됩니다.
- 사용자가 프로그램에 요청을 보냅니다 (예 : 장바구니에 제품 추가).
- 컨트롤러는 해당 요청 (제품 정보 및 사용자 정보)을 가져오고이 요청을 처리 할 프로그램의 필요한 부분을 호출합니다.
$user->addToCart($product)
- 프로그램 ( 이 경우 객체의
addToCart
기능 user
)은 의도 한 작업을 수행하고 응답을 반환합니다 (말하자success
).
- 컨트롤러는 다음을 사용하여 응답을 준비합니다
view
. 컨트롤러 객체에서$this->render($cartView('success')
이런 방식으로 컨트롤러는 프로그램에서 분리되어 전달 메커니즘으로 사용됩니다. 그들은 당신의 프로그램이 어떻게 작동하는지 알지 못하며, 요청을 위해 프로그램의 어느 부분이 호출되어야 하는지를 알고 있습니다.
다른 프레임 워크를 사용하려면 앱을 변경할 필요가 없으며 요청을 위해 프로그램을 호출하기 위해 관련 컨트롤러를 작성하기 만하면됩니다.
또는 데스크톱 버전을 만들려면 앱이 동일하게 유지되므로 전달 메커니즘을 준비하면됩니다.
그리고 Model
. 이를 지속성 메커니즘으로 생각하십시오.
OO 방식으로 프로그램에 데이터를 보유하는 객체가 있습니다.
class User {
//...
private $id;
private $shoppingCart;
//...
}
class Product {
//...
private $id;
//...
}
장바구니에 제품을 추가하면 제품을 장바구니에 추가 할 수 있습니다 product::id
.user::shoppingCart
.
데이터를 유지하려는 경우 model
일반적으로 ORM을 사용하여 구성되는 프레임 워크 일부를 사용하여 클래스를 데이터베이스 테이블에 맵핑 할 수 있습니다.
사용하는 ORM을 변경하려는 경우 프로그램은 그대로 유지되며 맵핑 정보 만 변경됩니다. 또는 데이터베이스를 함께 사용하지 않으려면 데이터를 일반 텍스트 파일에 쓰면 앱이 그대로 유지됩니다.
먼저 프로그램을 작성하십시오. 'OO'방식으로 프로그래밍하는 경우 언어의 일반 오래된 개체를 사용하십시오. 처음에는 MVC 측면에서 생각하지 마십시오.