Uso correto do padrão MVC
04/04/2013 21:15
0
Olá Pessoal,

Tenho as seguintes classes de domínio:
- Cliente;
- Contas;
- Usuario;

Em Cliente e Contas, existe o atributo de Usuario, isto é, quando cadastrados clientes e contas, pertencerão a um usuário.

Em Contas, também existe o atributo Cliente, isto é, uma conta pertencerá a um cliente.

Na minha aplicação, quando for cadastrar uma Conta, é necessário que a listagem de Cliente fosse mostrado apenas clientes pertencente ao Usuario logado.

Para resolver, fiz da seguinte forma:
1. Sobrescrevi o método list na classe de domínio Cliente, que recebe o usuário como parâmetro, conforme abaixo:
def static list = {Usuario usuario ->
if (usuario.peritoexterno.equals("Sim"))
{
this.findAllWhere(usuario: usuario)
}
else
{
this.list()
}
}

2. Passei o usuário da sessão como parâmetro na chamada do método list na view Create da classe Conta, conforme abaixo:
<g:select id="cliente" name="cliente.id" from="${sistema.Cliente.list(session.usuario)}" optionKey="id" required="" value="${contaInstance?.cliente?.id}" class="many-to-one"/>


Funcionou perfeitamente, mas fiquei me questionando se esta é a forma correta de usar o modelo MVC, isto é, estou fazendo a View entrar em contato direto com o Model, pois não alterei nada no Controller.

Existe uma forma mais elegante de fazer isto? Ou é desta forma mesmo?

Desde já agradeço a ajuda de quem puder colaborar.
Tags: .


0
O que você pode fazer para melhorar isto é chamar a controller, pois ela é a responsável por orquestrar as views e os objetos.


def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
[clienteInstanceList: Cliente.list(params), clienteInstanceTotal: Cliente.count()]
}


Por padrão quando você requisitar a listagem do Cliente, ele já vai cair neste método, isso é definido pelo Grails, assim, basta acessar clienteInstanceList na camada de apresentação.

Assim você estaria aplicando, melhor, o conceito de MVC.

Obs.: Pode abstrair este exemplo para popular esta lista, mas aí teria que mudar o nome do método, para ser exibido abaixo do cadastro, enfim, depende da sua regra de negócio e definições da aplicação.

Espero ter ajudado.


0
Oi Eduardo,

Inicialmente agradeço sua iniciativa em auxiliar.

Eu tentei usar o controller do cliente e não tive sucesso, pelo seguinte:
- Estou na view da classe Conta executando o seguinte comando
<g:select id="cliente" name="cliente.id" from="${sistema.Cliente.list(session.usuario)}" optionKey="id" required="" value="${contaInstance?.cliente?.id}" class="many-to-one"/>

- Quem comanda esta view é o ContaController; e
- Este "sistema.Cliente.list()" não é a chamada ao método LIST do ClienteController.

Na época fiz vários testes alterando o método LIST da classe ClienteController, mas sempre sem resultado algum. Então percebi que o método List dos Controladores apenas controlam a view LIST e não qualquer listagem do domínio desejado.

Fiz da forma como citei por não encontrar outra forma de fazê-lo. E então venho me questionando se realmente foi a melhor forma.


0
Mas existe o relacionamento entre Cliente e conta certo? Portanto você pode obter estes valores de contas do seu cliente tranquilamente.


def cliente = Cliente.get(cliente.id)
def contas = cliente.contas.sort() //cliente.contas.list()


É que o nome list no método da controller tem, por padrão, a característica de trabalhar com a listagem mesmo, veja:

index -> leva para a list -> list.gsp
create -> cria novo objeto -> create.gsp
list -> listagem -> list.gsp
update -> alteracao -> N/A
delete -> deleção -> N/A
show -> tabela de exibição das propriedades da Domain -> show.gsp
save -> salva e redireciona para create() ou list() -> N/A

Portanto estas palavras, 'pertencem' a controller com estas definições, espero que tenha compreendido.

Case exista o relacionamento na Domain entre cliente e contas, o que eu acredito haver, então não existe a necessidade de você passar este valor buscando desta forma. Até pelo fato de que por padrão o Grails utiliza o lazy nas buscas, então ao buscar um Cliente, seus relacionamentos, neste caso os objetos, já vem preenchidos.

Espero que tenha compreendido. E que tenha lhe auxiliado de alguma forma, útil. Abs e boa sorte com o projeto.



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto