Herança entre models no cakephp
Estou trabalhando/desenvolvendo um sistema de CRM (gestão de vendas e relacionamento com cliente) todo feito em cakephp, que é um framework Orientado a objetos que segue o padrão MVC (espero que não esteja me confundindo aqui).
Nesse projeto tenho em minhas models uma class Empresas, cujo atributo classificacao_id define a empresa como um lead, um cliente, um fornecedor, etc… Até aí tudo lindo. O problema é que cada uma dessas classificações possuem regras de negócio bastante específicas – por exemplo, um Cliente pode realizar compras, que por sua vez devem compor a meta de vendas, fornecedores devem trabalhar com valores em diferentes moedas, e por aí vai. Devido às inúmeras regras de negócio que iriam surgir meu controller Empresas ia ficar com um tamanho gigantesco, o que poderia dificultar um pouco a manutenção e me criar outros problemas com o passar do tempo.
Logo, para tentar deixar o código mais simples, resolvi aplicar o conceito de herança, onde cada classificação de empresa seria uma classe que herdaria o core da classe Empresa. Dessa forma os métodos dito genéricos, como o CRUD ou alguns relatórios, ficariam na classe pai enquanto que nos filhos eu teria somente os métodos de uso específico de determinada classificação.
Ok, mas como que eu ia fazer isso no cake?
No cakephp toda model, controller e view é filho de uma classe AppAlgumaCoisa que por sua vez é filho de AlgumaCoisa … Então herança já é natural pro cake.
Mas nem tudo é simples, minha tentativa inicial de fazer um class Cliente extends Empresa não dava certo. A dica de usar App::Import(‘Model’, ‘Empresa’); antes da definição da class Cliente veio do pessoal da lista CakePHP-Tuga (não sei o quê é esse Tuga ) e por fim cheguei ao seguinte model:
<?php App::Import('Model', 'Empresa'); class Prospect extends Empresa { var $name = 'Prospect'; } ?>
O mesmo foi feito para o controller. Apliquei o App::import(‘Controller’, ‘Empresas’); antes de definir minha class.
<?php App::import('Controller', 'Empresas'); class ProspectsController extends EmpresasController { function teste() { $this->Empresa->recursive = -1; $this->set('meusprospects', $this->Empresa->find('all')); } } ?>
A única dúvida que tenho é que no momento minhas views de prospect estão sendo criadas em empresas/ não que seja ruim, mas com o tempo eu terei tantas views na pasta que fica meio que inviável essa solução. O meu ideal é que as views de Clientes estejam na pasta clientes/ e não em empresas/
Fica aqui então lançado mais um desáfio pra mim
descobrir como alterar a view default de determinado controller.