como estruturar modelos MVC e modelos ORM

5

Eu tenho alguns problemas para obter uma boa estrutura de pastas no meu projeto e gostaria de saber que outras formas eu poderia usar para estruturar meus arquivos.

Atualmente, estou trabalhando em uma pasta resistente do MVC.

www/
  Controllers/
  Models/
  Views/

Nada de especial até agora. Mas também estou usando um sistema ORM. Com ele eu posso facilmente obter um 'objeto' do meu banco de dados como:

ORM::load('table');

Agora esse tipo de código deve residir em um modelo certo? Então eu consegui algo assim:

<?php
class userModel
{
    public function getAllUsers ( )
    {
        return ORM::load('table');
    }

    public function getUserById ( $id )
    {
        return ORM::load('table', 'userid=?', array($id));
    }
}
?>
Parece bom até agora na minha opinião ... Mas há mais uma coisa. Eu também posso especificar um 'modelo' ao usar o sistema ORM. Com este modelo basicamente posso configurar regras de validação. Assim:

ORM::withModel('authModel');

Isso permite ao ORM saber que antes de adicionar uma nova linha (ou atualizar uma já existente) ao banco de dados, deve verificar primeiro o seguinte modelo para as regras de validação.

<?php
class authModel //Or maybe authValidation??
{
    // Method gets automatically triggered when an update is done with the ORM
    public function onUpdate ( $obj )
    {
        if ( $obj->username == '' )
            throw new \Exception('No username');
    }

    public function onInsert ( $obj )
    {
        // Validations here too.
    }
}
?>

Agora o problema é que eu tenho 2 tipos de modelos. Um onde eu basicamente uso getters / setters para obter e armazenar dados para o banco de dados (do meu controlador para o meu modelo).

E eu tenho outro modelo em que as regras de validação estão definidas ... Eu não quero misturar as duas na mesma pasta. Então eu preciso criar outra estrutura para isso. Algo como:

www/
  Controllers/
  Models/
    Repositories/
    Entities/
  Views/

É apenas que o meu modelo não é um repositório real, já que ele não armazena nenhum objeto na classe repo e não tem um método commit () ou algo assim.

Eu também não consigo armazenar o segundo modelo (para validações) na pasta Entities, porque eles não são Entities ...

Alguma ideia de como eu deveria estruturar isso?

    
por user1175327 16.04.2012 / 17:12
fonte

4 respostas

1

Eu não me considero um desenvolvedor de backend, portanto, antes de responder, sugiro veementemente que você gaste algum tempo observando como os outros estão fazendo a arquitetura MVC. Eu acho que CakePHP é um ótimo lugar para começar (e seu código está muito bem documentado!).

A maneira que eu gostaria de fazer isso é criar uma pasta / Utilities que outras partes do seu programa possam chamar quando necessário. Coisas que você pode estar usando em vários controladores, visualizações ou modelos. Você pode colocar regras de validação padrão - notEmpty (), alphaNumeric (), email (), etc. - neste arquivo (/Utilites/Validation.php).

Em seguida, você pode criar um /Models/Model.php que tenha seu modelo de modelo básico (salvar, excluir, atualizar, antesSalvar etc.) que permita que novos modelos herdem dele para que você não precise copiar / colar repetidas linhas de código em todos os lugares. Então você poderia fazer seu userModel e, se necessário, ter uma validação customizada dentro desse arquivo.

Mais uma vez, não um desenvolvedor de back-end, mas eu estou familiarizado com o CakePHP e observando como eles decidiram lidar com essas dificuldades pode lhe dar algumas ideias!

    
por 25.04.2012 / 06:26
fonte
1

Basta renomear "Repositórios" "Validações" ou "Regras" e tudo faz sentido novamente.

    
por 28.05.2012 / 10:45
fonte
0

Estou um pouco confuso com a primeira pergunta. Eles estão realmente trabalhando com recuperação e armazenamento de dados, mas não enviam dados em nenhum lugar? Ou você está dizendo que eles não armazenam realmente um objeto dentro da classe, então você não deveria chamá-los de Repositório? Se é porque eles não armazenam um objeto, você pode renomear o diretório para o DataAccess ou algo similar.

Se os arquivos dentro do diretório Entities estiverem apenas fazendo validação, você pode renomeá-lo para Validation ou ValidationRules.

Espero que tenha ajudado um pouco, mas na verdade, desde que o nome do diretório descreva com precisão quais são os arquivos internos dele, tudo bem.

    
por 28.04.2012 / 09:40
fonte
0

Existem diferentes abordagens em relação à estrutura, e a decisão é tomada com base na quantidade de abstração desejada.

Se você quiser separar as classes de validação e modelo de dados, poderá colocar as classes de dados no diretório Entity e nas classes de validação no diretório Validation , ambas em Model directory.

Você pode colocar os métodos de pesquisa no diretório Repository se estiver usando uma classe de repositório separada. Ou você pode combiná-lo com a classe de dados.

Estruturas diferentes e diferentes sistemas ORM possuem diferentes convenções. Você pode querer verificar a estrutura e a documentação do ORM sobre as melhores práticas.

    
por 28.04.2012 / 09:55
fonte