Nota: Robert C. Martin (tio Bob) explica isso de uma maneira muito melhor e bem-humorada em sua palestra: Architecture the Lost Years . Um pouco longo, mas ensina muitos bons conceitos.
tl; dr: não pense e planeje seu aplicativo em termos de MVC. A estrutura MVC é apenas um detalhe de implementação.
A coisa mais confusa sobre o MVC é que os desenvolvedores tentam usar todos os componentes colados.
Tente pensar nos termos de um programa, não nos termos da estrutura.
Seu programa tem um propósito. Ele pega alguns dados, faz coisas com dados e retorna alguns dados.
Dessa forma, o controller
é o mecanismo de entrega do seu programa.
- Um usuário envia uma solicitação ao seu programa (digamos, adicione um produto ao carrinho de compras).
- O controlador aceita essa solicitação (informações do produto e informações do usuário), chama a parte necessária do seu programa que tratará dessa solicitação
$user->addToCart($product)
- Seu programa (
addToCart
função do user
objeto neste caso) faz o trabalho que ele pretende fazer e retorna uma resposta (digamos success
)
- O controlador prepara a resposta usando o relevante
view
: por exemplo. no objeto do controlador$this->render($cartView('success')
Dessa forma, os controladores são dissociados do programa e usados como mecanismo de entrega. Eles não sabem como o seu programa funciona, apenas sabem qual parte do programa precisa ser chamada para as solicitações.
Se você quiser usar outra estrutura, seu aplicativo não precisará de alterações, basta escrever controladores relevantes para chamar seu programa para solicitações.
Ou, se você quiser criar uma versão para desktop, seu aplicativo permanecerá o mesmo, você só precisará preparar um mecanismo de entrega.
E o Model
. Pense nisso como um mecanismo de persistência.
No modo OO, existem objetos no seu programa que mantêm os dados.
class User {
//...
private $id;
private $shoppingCart;
//...
}
class Product {
//...
private $id;
//...
}
Ao adicionar um produto ao carrinho de compras, você pode adicionar o product::id
ao user::shoppingCart
.
E quando você deseja persistir os dados, pode usar a model
parte da estrutura, que geralmente consiste em usar um ORM, para mapear as classes para as tabelas do banco de dados.
Se você deseja alterar o ORM usado, seu programa permanecerá o mesmo, apenas as informações de mapeamento serão alteradas. Ou, se você quiser evitar os bancos de dados todos juntos, basta gravar os dados em arquivos de texto sem formatação e seu aplicativo permanecerá o mesmo.
Então, escreva seu programa primeiro. Se você programar com o modo 'OO', use objetos antigos simples da linguagem. Não pense em termos de MVC no início.