Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Boas práticas - divisão de arquivos por usuario

Olá pessoal!

Estou com uma dúvida, acredito que um pouco simples mas que está freando começar alguns projetos que tenho em mente...

Preciso criar acesso e telas especificas por tipo de usuário, porém qual seria a melhor prática para divisão dos arquivos no codeigniter?

Devo criar pastas para cada tipo de usuario para os controllers, views e models?

Ex: user1: ../user1/controllers ../user1/views ../user1/models

user2: ../user2/controllers ../user2/views ../user2/models

Devo criar prefixo para os arquivos e deixa-los todos na mesma pasta?

Ex: user1: ../user1_controllers ../user1_views ../user1_models

user2: ../user2_controllers ../user2_views ../user2_models

Ou devo criar uma pasta do sistema codeigniter completa para cada tipo de usuario e redirecionar para o sistema do usuario a partir do login?

Agradeço desde já a atenção!

9 respostas

Olá Igor, tudo bem?

Não entendi bem. Me explica quem seria esses usuários. Para ter ideia se entendi a dúvida.

Seriam usuários do seu sistema, ou você se refere a desenvolvedores que lhe ajudariam a desenvolver o software?

Abraço,

Ola Paulo, obrigado pela atenção.

Seriam usuarios do sistema mesmo, não desenvolvedores. (Direção, funcionarios, clientes e nao clientes...)

Em um grupo do facebook o pessoal me indicou utilizar HMVC (modulos) e consegui inplantar no sistema da aula, acredito que é uma solução interessante para o problema. Pois vou separar cada modulo por tipo de usuario...

Mas um outro pessoal ja indicou usar roles, mas ainda não consegui nada a respeito... :/

Igor, fazer divisão por arquivo será extremamente complicado manter. Se novos tipos de usuáiros surgirem você vai precisar duplicar todo o código que possui, e depois para dar manutenção, se existir algum bug em um arquivo da direção que também existe nos clientes, você terá que lembrar de corrigir em todos os lugares onde aquele código está e lembra disso é praticamente impossível.

Sempre faça divisão lógica, não física, ou seja, via lógica de negócio da sua aplicação. O uso de ROLES é extremamente mais indicado. Seus usuários são dividos na aplicação pela lógica dela e não via arquivos. Manter será incomparavelmente mais fácil.

Perdão se pareci meio enfático, pois esse era o propósito. Raros os casos onde separar por arquivo pode ser uma solução viável. Em geral é apenas dor de cabeça pro futuro e manuenção impossível da aplicação. Na verdade, não consigo pensar um cenário onde dividir usuários por arquivos físicos seja bom. :)

Abraço.

Não tem o que se desculpar Paulo.

Como disse anteriormente, outro programador havia me indicado user ROLES, mas eu não achei na internet nada que eu conseguisse aplicar, pelo menos até agora... Os tuto's que achei estavam meio confusos para mim ainda.. :/// nooob!

Você teria algum tutorial/exemplo para me passar por favor?

Opa Paulo, beleza?

Cara, veja se eu estou entendendo bem ou se eu não estou conseguindo explicar bem minhas dúvidas...

No sistema de login que criei, fiz um helper para controlar o acesso (assim como na aula) chamo o helper sempre que quero restringir o acesso à alguma classe/metodo.

Nesse caso ele pega a classe e método e verifica no banco se o usuario tem acesso a esta funcionalidade, que está previamente cadastrada no banco...

Feito isso a única coisa que preciso fazer é chamar a função autoriza nos controllers em cada classe / método e cadastra-la no banco... O que também pode ser automatizado a parte do banco, acredito que até pelas migrations (ainda não aprendi direito sobre migration hehe)...

Nesse caso, se eu tiver um novo tipo de usuario, eu terei que alterar somente no banco o acesso às funções (classe/método) do usuario criado... Pois todos os arquivos estão somente chamando o helper que faz a autorização e mesmo o helper não tem valores definidos, pois ele busca no banco os valores...

Veja no link os arquivos e a imagem do banco nos comments: https://gist.github.com/igortrinidad/887e3bc0643022101c6e

Seria isso uma espécie de roles?

Super entendi os benefícios de não fazer divisão fisica, mas pela lógica... O que ainda não consegui absorver/implementar é como fazer a lógica de mostrar X conteúdo para um usuario e Y para outro... Isso de forma dinãmica...

solução!

Oi Igor,

Você está entendo praticamente certinho já.

A questão das ROLES funciona assim:

Vamos supor que temos 2 usuários na aplicação um é o José e o outro é o Raul. O José é administrador e o Raul é funcionário normal da empresa. Você deseja mapear isso no sistema, então o que você precisa fazer é definir no sistema essa relação em primeiro lugar. Para tentar ajudar vou simular uma tabela (não de banco, apenas para relacionar) juntando os dois usuários.

|     Usuário     |     Role    |
|     José        |     ADMIN   |
|     Raul        |     USER    |

No seu sistema você precisa ter um local onde verificar se o usuário possui a role para aquela funcionalidade, algo assim:

public function edita($id) {
        autoriza('USER'); // Eu passaria a ROLE necessário para autorizar...
    // ... demais código abaixo ...
}

É preciso que no método onde você quer autorizar, você informe que tipo/nível de autorização você está tentando realizar, pois senão, realmente não tem como o autoriza saber qual o nível do usuário que você está tentando autorizar.

No autoriza você vai verificar o usuário logado e todas as ROLES dele (que podem ser mais de uma) e permite ou não aquela operação que ele está tentando realizar.

Deu pra entender melhor? Espero que sim :)

Dessa forma que você está tentando realizar (pelo código que vi) é bem complexo. Verificar além da ROLE também se será gravar/alterar/remover/listar é bem complicado, mas da pra fazer. Porém sugiro fazer primeiro o simples e depois implementar dessa forma aí.

Qualquer dúvida, estou aqui.

Abraço.

Opa Paulo,

Desculpe o atraso no retorno...

Estive ocupado com o trabalho e não consegui dedicar ao curso...

Acredito que entendi o funcionamento do ROLES no CI, inclusive a forma que mostrei já estava funcionando perfeitamente! Autorizando o acesso aos metodos e classes pelo banco, tudo muito automatizado e centralizado no banco... Porém acabei me deparando com o Laravel nesse meio tempo e me chamou muita atenção o projeto.

Como estou com alguns projetos pessoais engatilhados, preciso definir a ferramenta para concentrar minhas energias e tentar produzir algo concreto, sabe?

Mas percebi que a curva de aprendizagem do Laravel é bem maior e o fato do framework atualizar com maior frequência, meio que dificulta pois boa parte do tuto's disponíveis não funcionam bem em versões atuais... Mas vou tentar pq o projeto é bem interessante e tem outras ferramentas que facilitam muito o uso do framework...

De qualquer forma agradeço toda sua atenção cara!

Se por ventura eu volte pro CI é provavel me ver aqui novamente (helps do curso)... hehehhe

Igor, de fato o Laravel atualiza com mais frequência e isso pode ser um problema no início, porém a longo prazo a ideia é que essa frequência de atualização caia e que não tenha problemas de uma atualização para outra.

O CodeIgniter é muito bom, porém já está chegando ao final de sua contribuição na comunidade php. Recomendo olhar o laravel e recomendo inclusive o livro do meu colega aqui da Caelum, Rodrigo Turini - http://www.casadocodigo.com.br/products/livro-laravel-php

Você verá conceitos novos nesse framework que está sendo o mais amado da comunidade php atualmente rsrs.

Abraço e sucesso nos seus projetos.

Que bacana cara,

Precisava mesmo de uma dica de livros da CDC!

Abraços

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software