CodeIgniter com Blade e Eloquent

Olá galera, tudo bem?

 

Bom hoje vou falar sobre a integração do Blade Template e do Eloquent ORM do Laravel no CodeIgniter.

 

Mas qual o motivo desse artigo? Bem recentemente participei de um projeto bem legal, onde foi desenvolvido um ERP usando o Framework Laravel, minha experiencia naquela época com ele se resumia em saber o seu nome e que ele segue o Design Pattern MVC. Até aquele momento só conhecia o CodeIgniter  também conhecido como CI, que foi o meu primeiro Framework PHP favorito.

 

Mas o que isso tem a ver com esse artigo? Como todos devem saber (ou a maioria) o CI já é um Framework maduro e bem simples de iniciar um projeto, um pouco diferente do Laravel, onde sua estrutura e sua dinâmica de funcionamento são bem peculiares.

 

Não é meu objetivo dizer qual é o melhor Frameork PHP. Longe disso, só quero demonstrar a possibilidade de utilizar alguns recursos que julgo interessantes do Laravel no CI.

 

Bem, mãos na massa

Essa será a seguencia do nosso projeto.

  1. Criar o Projeto;
  2. Instalar as dependências;
  3. Configurar os ganchos;
  4. Testar a Integração.

 

Criar o Projeto

Vamos usar o Composer para criar nosso projeto e instalar as dependências.

No seu diretório execute o comando, via terminal:

 

composer create-project bcit-ci/codeigniter ci_eloquent_blade --prefer-dist

 

Após concluir a criação do projeto, acesse o diretório com o comando:

 

cd ci_eloquent_blade

 

 

Instalar as dependências

Já no diretório instale as dependências com os comandos:

 

composer require xiaoler/blade

composer require illuminate/database

 

Pronto o projeto já está criado e com suas dependências instaladas.

 

Configurando o projeto

 

Para que você possa utilizar o Blade e o Eloquent, execute as configurações a seguir.

composer.json

Abra o arquivo composer.json na raiz de seu projeto, adicione o seguinte atributo.

 

"autoload": {
    "classmap": [
       "application/models"
    ]
}

 

Depois da edição o arquivo deverá ter essa aparência:

 

{
    "description": "Projeto usando Eloquent e Blade no CI",
    "name": "marcos-queiroz/ci_eloquent_blade",
    "type": "project",
    "license": "MIT",
    "require": {
        "php": ">=5.3.7",
        "illuminate/database": "^5.5",
        "xiaoler/blade": "^5.4"
    },
    "suggest": {
        "paragonie/random_compat": "Provides better randomness in PHP 5.x"
    },
    "require-dev": {
        "mikey179/vfsStream": "1.1.*",
        "phpunit/phpunit": "4.* || 5.*"
    },
    "autoload": {
        "classmap": [
           "application/models"
        ]
    }
}

 

application/config/config.php

Como você está utilizando pacotes instalados via Composer, vai precisar ajustar a configuração para que esses pacotes sejam carregados corretamente. Para isso vá até o diretório application/config e abra o arquivo config.php. Nele voce deve alterar a configuração do autoload do Composer, conforme código a seguir:

 

$config['composer_autoload'] = './vendor/autoload.php';

 

Configure Hooks (ganchos)

Precisamos informar ao CI que precisando usar o Hooks. Abra application/config/config.php e altere o valor:

 

$config['enable_hooks'] = TRUE;

 

Crie o arquivo hooks.php no diretório: application/config/ e adicione o seguinte código:

 

$hook['post_controller_constructor'][] = [
    'class'    => 'EloquentHook',
    'function' => 'bootEloquent',
    'filename' => 'EloquentHook.php',
    'filepath' => 'hooks'
];

 

Este gancho é chamado após o método do construtor do Controller ser executado. Crie o arquivo EloquentHook.php no diretório: application/hooks e adicione o seguinte código:

 

instance =& get_instance();
    }

    /**
     * Loads database
     */
    private function loadDatabase() {
        $this->instance->load->database();
    }

    /**
     * Returns the instance of the db
     * @return object
     */
    private function getDB() {
        return $this->instance->db;
    }

    public function bootEloquent() {

        $this->setInstance();

        $this->loadDatabase();

        $config = $this->getDB();

        $capsule = new Capsule;

        $capsule->addConnection([
            'driver'    => 'mysql',
            'host'      => $config->hostname,
            'database'  => $config->database,
            'username'  => $config->username,
            'password'  => $config->password,
            'charset'   => $config->char_set,
            'collation' => $config->dbcollat,
            'prefix'    => $config->dbprefix,
        ]);

        $capsule->setAsGlobal();
        $capsule->bootEloquent();
    }
}

 

Ele vai usar as configurações que você definir em application/config/database.php.

 

application/libraries/Blade.php

Crie um arquivo chamado Blade.php no diretório application/libraries para que possa adicionar as regras de integração entre o CodeIgniter e a Blade Template Engine. Após criar o arquivo, adicione o código a seguir nele:

 

directive('datetime', function($timestamp) {
            return preg_replace('/(\(\d+\))/',
                    '', $timestamp);
        });
        $compiler->directive('now_datetime', function() {
            return '';
        });
        $resolver = new \Xiaoler\Blade\Engines\EngineResolver;
        $resolver->register('blade', function () use ($compiler) {
            return new \Xiaoler\Blade\Engines\CompilerEngine($compiler);
        });
        $this->factory = new \Xiaoler\Blade\Factory($resolver,
                            new \Xiaoler\Blade\FileViewFinder($file, $path));
        $this->factory->addExtension('tpl', 'blade');
    }
    public function view($path, $vars = [])
    {
        echo $this->factory->make($path, $vars);
    }
    public function exists($path)
    {
        return $this->factory->exists($path);
    }
    public function share($key, $value)
    {
        return $this->factory->share($key, $value);
    }
    public function render($path, $vars = [])
    {
        return $this->factory->make($path, $vars)->render();
    }
}

 

Após criar a library você deverá atualizar o arquivo application/config/autoload.php de modo que ela seja carregada junto da aplicação, de forma automática.

 

$autoload['libraries'] = array('Blade');

 

Importante

Crie o diretório views em application/cache/ e lembre-se que o diretório precisa ter permissão de escrita para que os arquivos de cache sejam criados. Caso ao executar o teste de funcionamento no browser você se depare com erros envolvendo file_get_contents, verifique as permissões do diretório.


Testando as Integrações


Agora que acabamos de configurar o projeto, adicione os Models, Controllers e Views para facilitar o entendimento.

 

Nota

Após criar seus Models execute o comando no terminal:

 

composer dump-autoload

 

Caso contrário, você verá a exeção da classe como não encontrada, quando você tentar usar o Model.


Bom é isso por hoje, não se equeça de alterar o arquibo Routes.php para apontar para o Controller Home.  

 

Os fontes desse artigo: github.com