A maioria dos frameworks php estritos do MVC [fechado]

8

Estou tentando entender o padrão MVC há cerca de 6 meses. Li vários artigos, perguntas e respostas e postagens em blogs sobre padrões MVC e HMVC, mas simplesmente não entendo 100%.

Tentei aprender MVC exercitando uma das estruturas PHP MVC amplamente usadas, CodeIgniter. Eu implementei alguns sites internos para a minha empresa. E AINDA, eu não entendo 100%. Acredito que uma das melhores maneiras de aprender algo é seguir regras estritamente definidas.

Então, minha pergunta é: Qual é a estrutura PHP mais rigorosa em termos de como o padrão MVC é implementado? Um que define como uso modelos, controladores e visualizações para que eu possa entender completamente o que é MVC?

kidonchu
fonte

Respostas:

13

Resposta curta

Não existe tal coisa.

Versão mais longa:

Estruturas não implementam MVC ou padrão de design inspirado em MVC. Sua aplicação faz.

O MVC não é um molho mágico, que você pode adicionar ao seu aplicativo despejando-o em uma estrutura. Em vez disso, você precisaria aprender e entender o referido padrão (e os princípios e práticas que o acompanham, como SOLID , LoD , SoC ) . Somente então você pode tentar usá-lo na sua escolha de uma estrutura.

Se um quadro anuncia que "tem MVC" , então é completamente proferem dren . Nessa situação, é usado para "vender" a estrutura aos noobs que se preocupam mais com o hype mais recente do que com o design de aplicativos e práticas de codificação.

O objetivo de uma estrutura seria fornecer uma coleção de ferramentas que, quando usadas como um todo, forneçam um ambiente de desenvolvimento alterado / aprimorado. Eles lidam com coisas como roteamento, carregamento automático, abstrações de baixo nível para armazenamento (não, não estou falando de antipadrão de registro ativo) e o restante das coisas que permitem economizar tempo no desenvolvimento e manutenção da boh.

Em conclusão.

Não há estruturas MVC no PHP. Todos aqueles que me reivindicam estão realmente entre os piores. Ou seja - codeigniter, cakephp e yii. Evite-os a todo custo (exceto se você for muito bem pago).

Se você precisar usar uma estrutura, atualmente suas melhores opções seriam a versão mais recente do Symfony 2.x, Zend Framework 2.x ou Laravel 4.x. Esses não implementarão o MVC para você, mas causarão o menor dano à sua própria arquitetura de aplicativo.

mefisto
fonte
7
-1 Claramente, algumas estruturas são mais adequadas ao MVC do que outras. Geralmente são os que incluem modelos, visualizações e controladores.
Rein Henrichs 17/04
7
Modelo não é uma classe. é uma camada de aplicação. Se você possui uma estrutura que possui "modelos", é uma indicação clara que não está nem remotamente relacionada ao padrão de design do MVC ou aos conceitos nos quais o MVC é construído.
Mefisto 17/04
7
... é uma camada de aplicativo que precisa ser reificada de alguma forma. Em uma linguagem OO, isso normalmente significa usar objetos, o que significa usar classes. De qualquer forma, não estou interessado em me envolver com alguém tão abertamente rude e hostil com as idéias dos outros, então deixarei isso em paz.
Rein Henrichs
6
-1 O OP estava solicitando uma estrutura que aplicasse estritamente o uso do padrão MVC no aplicativo usando a estrutura. Sua resposta foi sobre "a melhor" estrutura e a filosofia sobre estruturas em geral, e não respondeu à pergunta do OP.
programador
3
+1 Cheguei essencialmente à mesma conclusão ao longo dos anos. Cake & co são os piores criminosos; talvez você consiga obter algo do MVCish deles se for martelá-los por tempo suficiente, mas eles realmente não são voltados para o design real do MVC. A melhor escolha são, de fato, estruturas que são apenas uma coleção de componentes solta e permitem implementar seu próprio aplicativo usando suas ferramentas generalizadas.
Deceze
7

Só posso falar com o Cake e não tenho nada de bom a dizer sobre isso em termos de MVC. Eles não fazem o MVC corretamente. O Codeigniter está na mesma linha. Não é de todo estranho que você não "tenha" MVC mesmo depois de usá-lo por um tempo.

O MVC é simplesmente separar adequadamente três componentes distintos da lógica do seu aplicativo: o núcleo do aplicativo , a apresentação e a cola necessária para fazer com que ambos funcionem em um contexto do mundo real.

O núcleo do seu aplicativo, que contém toda a lógica comercial, interação com o banco de dados, serviços, bipes e boops que tornam seu aplicativo "seu aplicativo", é o modelo. O modelo não é uma coisa específica em uma forma específica, é o que for necessário para que seu aplicativo funcione da maneira que funciona. Você só tem um "modelo", que é o seu aplicativo.

O View é usado para produzir de alguma forma o que o seu modelo faz. É a interface do usuário. É o necessário para mostrar informações úteis ao usuário. Pode ser um site, uma interface de linha de comando, uma GUI de área de trabalho nativa. Você pode usar os três no seu aplicativo.

O Controller é simplesmente o que resta para fazer esse trabalho, principalmente o que recebe as informações do usuário e as direciona para o local apropriado. Você pode ter vários tipos diferentes de controladores para diferentes tipos de contexto, por exemplo, um que pode lidar com solicitações HTTP recebidas, um que lida com a entrada da linha de comando e outro conectado a eventos da GUI.

O formato específico dessas partes individuais depende totalmente do seu aplicativo. Todos os três podem ser uma espécie de mini-aplicativo próprio. Qualquer "modelo" de estrutura pré-fabricada por modelo é feito para um caso generalizado para ajudá-lo a colocar algo em funcionamento rapidamente; geralmente não é a forma ideal que seu modelo deve assumir. Você precisará criar sua própria estrutura para o seu aplicativo , o que for mais adequado para construí-lo. Examine os princípios de POO, o SOLID, a injeção de dependência etc. e construa seu modelo principal de acordo com essas diretrizes. Em seguida, envolva visualizações e controladores, conforme necessário.

O objetivo dessa separação é simplesmente tornar o aplicativo sustentável e extensível. O modelo não contém nada que seja específico para qualquer forma específica de entrada ou saída. Por exemplo, ele não contém nenhum texto específico de formato (como mensagens de erro no formato HTML). Ele não assume nenhuma forma específica de entrada (como solicitações HTTP). O View, por outro lado, não contém nenhuma lógica comercial, seu trabalho é apenas produzir . E o controlador também não contém nenhuma lógica de negócios, seu trabalho é apenas "inserir" . O motivo é simplesmente que o controlador e a visualização são intercambiáveis, mas seu aplicativo não é.

Se você quiser usar uma estrutura para isso, use uma que seja modular e permita que você faça o que precisar. Zend, Symfony, Laravel e frameworks de escolha e escolha baseados em componentes similares são os mais adequados para isso.

deceze
fonte
Obrigado por esclarecer algumas dúvidas! Eu meio que entendi o que você quis dizer quando li esta linha. o controlador e a visualização são intercambiáveis, mas seu aplicativo não é. Porém, uma pergunta: em qualquer estrutura de pastas da estrutura, existe uma pasta chamada 'modelos'. Se o 'meu aplicativo' em si é o 'modelo', como eles devem ser chamados na pasta 'modelos'?
Kidonchu
Mais uma pergunta ... este tutorial é considerado semelhante à sua compreensão do padrão MVC? Parece que eles têm algo em comum, mas não tenho certeza; especialmente, comentário do administrador sobre ter todas as lógicas em um modelo com muitas classes de entidade, neste link .
Kidonchu
Acabei de ler esse tutorial, mas parece mais alinhado com o MVC "real". O modelo parece um pouco magro, mas espero que seja apenas porque é apenas um exemplo. Eu nomeio minha pasta de modelo "model", mas dentro dela crio várias subpastas; normalmente eu pelo menos distingo entre "primitves" (like Book), serviços ("actions", like collateBookCollection) e storage ( saveBookToDatabase). Você precisa tomar cuidado para não colocar muito código no controlador, o que é algo que a Cake & co. completamente errado. Faça seu modelo realmente gordo.
Deceze
Eu domain
nomeio o
7

Essa estrutura não pode existir por várias razões.

Primeiro de tudo, o modelo no padrão MVC é a parte que torna seu aplicativo seu aplicativo. Se uma estrutura definisse estritamente a aparência de um modelo, essa estrutura só seria utilizável para um ou no máximo alguns aplicativos. Isso efetivamente impede que seja uma estrutura.

O segundo problema é que não há consenso universal sobre como é uma aplicação adequada do padrão MVC. Por exemplo, alguns dirão que o Controlador deve fornecer à View os dados de que precisa do Modelo, enquanto outros dirão que a View deve recuperar as informações necessárias por si mesma e o Controller deve apenas garantir que a View saiba onde encontre o modelo.
Outro exemplo, mais específico para aplicativos da Web, é a quantidade de processamento que o View pode fazer. Para alguns, o View deve consistir exclusivamente em arquivos HTML, onde alguns espaços reservados são substituídos pelo conteúdo real (geralmente recuperado pelo Controller do Modelo), enquanto outros se sentem perfeitamente à vontade para permitir que o View faça o processamento relacionado à UI, como internacionalização do conteúdo apresentado.

Bart van Ingen Schenau
fonte
1
Eu vejo. Acho que vi uma vez esta citação "Se você perguntar 'o que é MVC' para dez pessoas diferentes, você receberá dez respostas diferentes". Eu acho que é isso que o seu segundo ponto significa.
Kidonchu
@kidonchu: Isso é parte dela, embora você também não deve ser surpreendido para obter 11 respostas diferentes daquelas 10 pessoas ;-)
Bart van Ingen Schenau
2

Entendo que este post tem anos, o que é ironicamente o motivo pelo qual estou postando esta resposta. Primeiro, algumas das pessoas que responderam a essa pergunta estão certas. Você realmente nunca encontrará um Framework PHP que seja "MVC Ready" pronto para uso ... necessariamente. Visto que a estrutura deveria ser uma base na qual os Dev's podem se basear nela, seguindo o MVC. No entanto, no último ano desde que isso foi publicado, algumas das estruturas PHP por aí certamente percorreram um longo caminho.

Eu brinquei com o CakePHP por um tempo, até hoje é uma configuração horrível e confusa de diretórios e estrutura, não há uma distinção clara entre lógica, ele tem um código muito mal comentado e tudo está meio amontoado em um pacote bagunça. Isso não é um discurso retórico no CakePHP, é uma verdade simples.

Zend, é excelente. Eles fornecem excelente documentação e comentários de código, têm uma comunidade muito amigável e fornecem uma estrutura muito agradável para desenvolvedores iniciantes e intermediários. Eles percorreram um longo caminho desde que o OP publicou isso.

E para as pessoas que dizem que não existe essa estrutura para responder à pergunta do OP, elas estão certas como eu disse acima. No entanto, eles também estão errados. Zend, Laravel e CodeIgniter são estruturas incríveis e, embora não "forneçam" o MVC, eles definitivamente pavimentam uma estrada para você, como desenvolvedor, criar aplicativos MVC maravilhosamente construídos, considerando que você, como desenvolvedor, segue o bom MVC práticas.

Para aqueles neste tópico dizendo CodeIgniter é horrível. Você está completamente errado, pelo menos pelos padrões de hoje. No momento deste post, eu não estava em estruturas, então não havia analisado isso então. Portanto, naquele momento, poderia ter sido horrível. Mas eu uso TODAS as minhas aplicações web agora. Eles fazem um ótimo trabalho ao criar uma estrutura sólida com uma estrutura de diretórios compreensível, além de fornecer algumas ferramentas incríveis para iniciar o MVC. Eles fazem um ótimo trabalho na distinção lógica, têm uma comunidade incrível de suporte e, em geral, fornecem uma excelente estrutura livre que, novamente, se você seguir as boas práticas de MVC, pode se transformar em aplicativos incríveis.

Para o ponto principal. Eu queria interpor minha opinião sobre esse assunto. Você nunca encontrará essa estrutura pronta para uso, perfeita, criada pelo MVC . No entanto, se você utilizar boas práticas de MVC e escolher uma estrutura sólida como Zend, Laravel e / ou CodeIgniter, ficará bem. Porque a verdade é que o MVC depende do desenvolvedor como ele implementa boas práticas e não a estrutura. A estrutura oferece a base, o resto depende do desenvolvedor.

Boas estruturas para usar como referências

  • CodeIgniter
  • Zend Framework
  • Laravel
  • Symfony 2 (adicionado após a leitura do comentário, porque também é um excelente framework)

Lembre-se de que, ao usá-las, é sua responsabilidade, como desenvolvedor, seguir as boas práticas de MVC. Existem muitos tutoriais sobre boas práticas de MVC. Eu me deparei com o site de um cavalheiro que tem algumas diretrizes surpreendentes , e ele visa um MVC adequado, e até agora suas postagens no blog têm sido muito boas, e ele é um ótimo lugar para começar a aprender.

Referência

Jason
fonte
Entendo que este post tem anos, o que é ironicamente o motivo pelo qual estou postando esta resposta. A questão agora é considerada fora de tópico e eu votei para fechá-la como tal. Uma das razões pelas quais agora consideramos essas postagens fora do tópico é justamente porque as informações estão desatualizadas com tanta facilidade.
precisa
Fiquei me perguntando por que você deixou de fora o Symfony 2. Então vi a referência a Tommy e tudo ficou claro.
Cerad 15/03/2015
Você está certo. Eu esqueci o symfony. Eu sempre esqueço esse porque raramente o uso. Mas estou curioso, como minha referência a Tommy "deixou claro"? O que isso significa = P
Jason
Bem, digamos que alguns anos atrás, Tom irritou um dos desenvolvedores mais sérios o suficiente para que o desenvolvedor pegasse sua lata de repelente de insetos. Tom é divertido de ler, mas vive em uma realidade diferente.
Cerad 15/03/2015
Não vou discordar lá rsrs. Ele é exigente e muito interessante e definitivamente vive em sua própria realidade. Mas admiro a série Model View Confusion. E para mim, ele tem uma ótima abordagem sobre o MVC adequado. Mas essa é apenas a minha opinião. Obrigado pelo esclarecimento @Cerad
Jason
1

Parece que você está tendo problemas para "juntar tudo", porque muitos tutoriais são ruins em explicar o MVC de maneira clara. Eu recomendo que você fique com as mãos "sujas" e crie um aplicativo simples com cerca de 3 a 5 estruturas diferentes para ver como elas normalmente abordam o problema. Alguns têm documentação sobre como configurar a arquitetura básica do MVC para um aplicativo e, caso contrário, você sempre pode pesquisar no Google alguns tutoriais de mvc para essa estrutura específica.

FWIW Gostei da recomendação de layout de projeto / diretório do Zend: http://framework.zend.com/manual/1.12/en/project-structure.project.html

Dê uma olhada também no "O framework PHP MVC sem estrutura" do Rasmus. Isso mostra que você realmente não precisa de uma estrutura, basta criar sua própria para atender às suas necessidades específicas. Além disso, você receberá um chute nos comentários! http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html

programador
fonte
Sim, eu admito que não posso reunir todos em um só pedaço. No entanto, seu link para o artigo de Rasmus esclareceu algumas dúvidas. Especialmente a idéia principal, 'não há necessidade de estrutura para implementar o padrão MVC'. Obrigado!
Kidonchu