Configurando o Yii2 com Oracle

Cálcio Heavy Metal
PHPRio
Published in
3 min readDec 21, 2016

Vou começar esse post como um pequeno desabafo. Infelizmente o Oracle definitivamente não serve para o PHP e é um pouco complexo e chato fazê-lo funcionar no Yii. Muitos dias procurando soluções, tentando instalar pacotes do PHP para conseguir usar esse banco no Yii 2.

A instalação das tranqueiras que precisa para o Oracle funcionar no Yii 2 estão nesse link.

Após o pequeno desabafo vamos a configuração do Yii2 com o Oracle.

Configurando arquivo /config/web.php

$config = [
‘id’ => ‘basic’,
‘language’ => ‘pt-br’,
‘timeZone’ => ‘America/Sao_Paulo’,
‘basePath’ => dirname(__DIR__),
‘bootstrap’ => [‘log’],
‘components’ => [
‘request’ => [
‘cookieValidationKey’ => ‘fy1WBzGpuoFKdMHFBmSSFOW6AC1o4e19’,
],
‘formatter’ => [
‘class’ => ‘yii\i18n\Formatter’,
‘defaultTimeZone’ => ‘America/Sao_Paulo’,
‘dateFormat’ => ‘php:d/m/Y’,
‘datetimeFormat’ => ‘php:d/m/Y H:i:s’,
‘timeFormat’ => ‘php:H:i:s’,
‘decimalSeparator’ => ‘,’,
‘thousandSeparator’ => ‘.’,
‘currencyCode’ => ‘R$’,
],

Configurando arquivo /config/db.php

return [
‘class’ => ‘yii\db\Connection’,
‘dsn’ => ‘oci:dbname=//172.168.10,1:1521/teste;charset=UTF8’,
‘username’ => ‘xxxx’,
‘password’ => ‘xxxx’,
‘on afterOpen’ => function($event) {
//$event->sender refers to the DB connection
$event->sender->createCommand(“ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ‘,.’”)->execute();
$event->sender->createCommand(“ALTER SESSION SET NLS_DATE_FORMAT = ‘DD/MM/YYYY’”)->execute();
$event->sender->createCommand(“ALTER SESSION SET NLS_SORT = WEST_EUROPEAN”)->execute();
},
‘enableSchemaCache’ => true,
// Duration of schema cache.
‘schemaCacheDuration’ => 3600,
// Name of the cache component used to store schema information
‘schemaCache’ => ‘cache’,
];

O on afterOpen, configura a sessão do Oracle para que assuma as características do nosso padrão de datas e moeda. Isso vai facilitar nossa vida lá nas views, inserts e updates.

Criando o arquivo /models/OracleActiveRecord.php

<?php
namespace app\models;

use Yii;
use yii\db\ActiveRecord;
class OracleActiveRecord extends ActiveRecord
{
final public function getNewId()
{
try {
$this->ID = Yii::$app->db->createCommand(“SELECT SEQUENCE_NAME.NEXTVAL FROM DUAL”)->queryScalar();
return $this->ID;
} catch (Exception $e) {
echo(“Error: $e\n”);
}
}
}

No meu caso eu criei uma sequence única para o projeto todo. Para mim isso facilita tudo, uma vez que o Oracle não faz um auto incremento.

Todos os seus outros models devem estender desse model criado.

Problemas enfrentados…

Mesmo sofrendo com as configurações para pelo menos iniciar um projeto com o Yii 2 com Oracle, ainda tenho problemas bizarros e sem explicação.

Palhaçada 1: Por exemplo 2 bases Oracle, uma o gerador de models conseguiu criar todas as relations (relações) uma outra base não (WTF????).

Palhaçada 2: Por algum motivo obscuro, ainda não conseguir usar as migrations do Yii com o Oracle.

Palhaçada 3 (esse é culpa do Yii 2): Demorei alguns dias para conseguir chegar nessa solução definitiva (para o meu caso) do OracleActiveRecord e fazer o auto incremento funcionar nem afetar todo o CRUD. Infelizmente a interface do Yii 2 não fornece um auto incremento já pronto (se alguém souber de um método, por favor me avise).

Com esse post já se consegue usar o Oracle com o Yii 2. Espero que ajude muito os Devs que sofrem com esse banco infeliz.

--

--