Na verdade esse thread não é para tirar dúvidas, e sim para dividir
conhecimento, como estou vendo a galera animada com site, tutoriais, artigos
e etc, penso que pode ser uma boa contribuição, pois com certeza outras
pessoas passarão por essa situação.
A questão toda é, na minha aplicação eu tenho uma estrutura um pouco
diferente da proposta por default pelo CI.
Dentro do diretório 'application' eu tenho outros 4 diretórios: frontend,
backend, services e models.
Tanto o 'frontend' quanto o 'backend' são as aplicações em si - no caso o
site e o admin - com todos os diretórios comuns as aplicações, como: config,
controllers, helpers, libraries, models, hooks, views, etc...
E o diretórios 'models' e 'services' são os que guardam as informações do
dóminio da minha aplicação. O 'models' guarda os modelos, e o 'services' é
como uma fachada (façade pattern) para a minha aplicação, ou seja, nele eu
tenho ruma interface comum de acesso que implementam rotina de N ou mais
classes, no meu caso modelos.
Eu preciso deixar o 'models' e os 'services' no mesmo nível do diretório das
aplicações, justamente para eles poderem ser compartilhados entre elas.
Eis que surge o problema.
Para carregar os modelos, dessa forma, basta eu usar:
$this->CI->load->model('../../models/Foto_Model', 'Photo', TRUE);
Mas e para carregar as classes, que são como Libraries em sua essência?
Nesse formato acima não consigo, pois o framework retorna um erro como se eu
estivesse tentando istanciar o meu controller duas vezes.
Solução: criei um helper, que serve como loader dessas classes.
<?php
/**
* ci_class_loader - load class in 'services' path
*
* @access public
* @param string
* @return object
*/
function ci_class_loader( $path ) {
require_once( $path.'.php' );
$name = end( explode( '/', $path ) );
$class = ucfirst( $name );
$ci =& get_instance();
$ci->$name =& new $class();
return $ci->$name;
}
?>
Partindo do princípio que suas classes começam com letra maiúscula, de
acordo com os coding stardads, e que o nome do arquivo é o nome da classe,
mas em minúsculo (padrão CI).
Exemplo de uma chamada de um service em um Controller:
<?php
require_once('base.php');
class Test extends BaseController {
function Test() {
parent::BaseController();
}
function index() {
$ret = ci_class_loader(ROOTPATH."/services/teste");
echo "<pre>";
print_r(get_class_methods($ret));
echo "</pre>";
die;
}
}
?>
Só para ressaltar, que esse ROOTPATH é uma constante que eu defini no meu
index.php, para retornar apenas o PATH e não o FULLPATH da aplicação.
Se quiserem adicionar esse conteúdo ao site, sintam-se a vontade, só
gostaria que me mantivessem como autor.
No mais, qualquer dúvida estamos aí.
Boa sorte a todos no processo de implementação do site.
Abraço,
Marcus Cavalcanti
_______________________________________________
Lista mailing list
[email protected]
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br