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

Responder a