Variables de entorno
Variables de entorno en máquinas "Basecentral"
El archivo de configuración del entorno provee a las aplicaciones de basecentral la independencia del modelo basado en el subdominio para identificar el entorno de ejecución.
Esto significa una mayor libertad y restricción en las configuraciones necesarias en los ambientes de desarrollo, pruebas y producción.
Archivo de configuración.
Las variables se han introducido al archivo de configuración utilizado para almacenar las configuraciones de acceso a base de datos.
Por ejemplo: mx_sinbdc_db.php
$AWS_REGION = "us-east-1"; $ENVIRONMENT = "dev"; $DB_HOST = "mysql-v55.dev.unoi-sc.sndinf.internal"; $DB_HOST_SLAVE = "mysql-v55.dev.unoi-sc.sndinf.internal"; $DB_PORT = "3306"; $DB_DRIVER = "pdo_mysql"; $DB_SCHEMA = "uno"; $DB_USER = "fidel_consucorp"; $DB_USER_SLAVE = "fidel_consucorp"; $DB_PASSWORD = "xxxxxxx"; $DB_PASSWORD_SLAVE = "xxxxxxx"; $AWS_ACCESS_KEY = "AKIAJSH7QNKJM2MWHEBQ"; $AWS_SECRET_KEY = "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"; $WS_URI = "http://desenv.sistemauno.com/ws/"; $AWS_BUCKET = 'prestatic-apps.uno-internacional.com'; $mySqlHost = "mysql-v55.dev.unoi-sc.sndinf.internal"; $mySqlDb = "uno"; $mySqlUser = "fidel_consucorp"; $mySqlPassword = "xxxxxxx";
La variable ENVIRONMENT puede contener los siguientes valores.
- desenv -> dev
- homol -> pre
- www -> pro
El mejor punto para incluir estas variables dentro de la aplicación es declararlas como constantes en el archivo index.php
// index.php // set error reporting ini_set('display_errors', 1); error_reporting(E_ALL); // change the following paths if necessary define('BASECENTRAL', '/basecentral/apache/web/'); define('COMPARTIDO', BASECENTRAL . 'aplicacion/compartido/'); $yii= COMPARTIDO . 'yii-1.1.10/framework/yii.php'; require_once '/basecentral/apache/conf/br_devmonitor_db.php'; defined('AWS_REGION') or define('AWS_REGION', $AWS_REGION); defined('ENVIRONMENT') or define('ENVIRONMENT', $ENVIRONMENT); defined('DB_HOST') or define('DB_HOST', $DB_HOST); defined('DB_HOST_SLAVE') or define('DB_HOST_SLAVE', $DB_HOST_SLAVE); defined('DB_PORT') or define('DB_PORT', $DB_PORT); defined('DB_DRIVER') or define('DB_DRIVER', $DB_DRIVER); defined('DB_SCHEMA') or define('DB_SCHEMA', $DB_SCHEMA); defined('DB_USER') or define('DB_USER', $DB_USER); defined('DB_USER_SLAVE') or define('DB_USER_SLAVE', $DB_USER_SLAVE); defined('DB_PASSWORD') or define('DB_PASSWORD', $DB_PASSWORD); defined('DB_PASSWORD_SLAVE') or define('DB_PASSWORD_SLAVE', $DB_PASSWORD_SLAVE); defined('AWS_ACCESS_KEY') or define('AWS_ACCESS_KEY', $AWS_ACCESS_KEY); defined('AWS_SECRET_KEY') or define('AWS_SECRET_KEY', $AWS_SECRET_KEY); defined('WS_URI') or define('WS_URI', $WS_URI); defined('AWS_BUCKET') or define('AWS_BUCKET', $AWS_BUCKET); $config=dirname(__FILE__).'/protected/config/main.php'; if(ENVIRONMENT == 'dev' || ENVIRONMENT == 'pre'){ // remove the following lines when in production mode defined('YII_DEBUG') or define('YII_DEBUG',true); // specify how many levels of call stack should be shown in each log message defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3); }else{ // No mostrar trace o detalle de errores en producción ini_set('display_errors', 0); } require_once($yii); Yii::createWebApplication($config)->run();
Acceso a base de datos.
La "nueva versión" del archivo de configuración incluye ahora información del ambiente de ejecución y los parámetros para acceder a la base de datos Master y Slave.
// protected/config/db.php // Ejemplo de configuración de base de datos if(ENVIRONMENT == 'dev'){ // para realizar el trace en debug_toolbar $yii_emulate_prepare = true; $yii_enable_profiling = true; $yii_enable_param_logging = true; $schemaCachingDuration = 0; }else{ $yii_emulate_prepare = false; $yii_enable_profiling = false; $yii_enable_param_logging = false; $schemaCachingDuration = 3600; } return array( 'components'=>array( 'db'=>array( 'connectionString' => "mysql:host=" . DB_HOST . ";dbname=" . DB_SCHEMA, 'username' => DB_USER, 'password' => DB_PASSWORD, 'charset' => 'utf8', 'emulatePrepare' => $yii_emulate_prepare, 'enableProfiling'=>$yii_enable_profiling, 'enableParamLogging'=>$yii_enable_param_logging, 'schemaCachingDuration' => $schemaCachingDuration, ), 'dbSlave'=>array( 'connectionString' => "mysql:host=" . DB_HOST . ";dbname=" . DB_SCHEMA, 'username' => DB_USER_SLAVE, 'password' => DB_PASSWORD_SLAVE, 'charset' => 'utf8', 'emulatePrepare' => $yii_emulate_prepare, 'enableProfiling'=>$yii_enable_profiling, 'enableParamLogging'=>$yii_enable_param_logging, 'schemaCachingDuration' => $schemaCachingDuration, ), ), );
Herramientas de Debug e Informe de errores
En el archivo index.php se ha definido ya si se informan o no los errores de php al usuario (display_errors) y el nivel del trace del framework. Sin embargo, la extensión debug_toolbar provee información valiosa para el desarrollador.
// protected/config/debug_toolbar.php return (ENVIRONMENT == 'dev')? array( 'modules'=> array( // uncomment the following to enable the Gii tool 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'contrato', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters' => array('127.0.0.1','10.10.*'), ), ), 'components'=>array( 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( // 'web'=>array( // 'class'=>'CWebLogRoute', // 'levels'=>'trace, info, error, warning', // 'categories'=>'system.db.*', // 'showInFireBug'=>true, //true/falsefirebug only - turn off otherwise // 'ignoreAjaxInFireBug'=>false // ), array( 'class'=>'CFileLogRoute', 'enabled'=>true, 'filter'=>array( 'class'=>'CLogFilter', 'prefixSession'=>true, 'prefixUser'=>true, 'logUser'=>true, ), 'levels'=>'error, trace, info', 'logPath'=>dirname(dirname(__FILE__)).'/logs/', 'logFile'=>'yii_log', 'maxFileSize'=>2048, 'maxLogFiles'=>10 ), array( 'class'=>'compartido.extensions.yii-debug-toolbar.YiiDebugToolbarRoute', 'ipFilters'=>array('127.0.0.1','10.10.*'), 'levels'=>'error, trace, info', ) ), ), ), ) : array('components'=>array( 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'enabled'=>true, 'filter'=>array( 'class'=>'CLogFilter', 'prefixSession'=>true, 'prefixUser'=>true, 'logUser'=>true, ), 'levels'=>'error, trace, info', 'logPath'=>dirname(dirname(__FILE__)).'/logs/', 'logFile'=>'yii_log', 'maxFileSize'=>2048, 'maxLogFiles'=>10 ), ), ), ), );
En el ejemplo anterior se ha incluido en la configuración la herramienta extensión debug_toolbar y el módulo Gii que deben ser solo accesibles en los ambientes de desarrollo.
Variables de entorno en los parámetros de la aplicación.
Finalmente las variables serán incluidas en el archivo main.php y formarán parte de la aplicación.
// protected/config/main.php return CMap::mergeArray( require_once dirname(__FILE__).'/debug_toolbar.php', require_once dirname(__FILE__).'/db.php', array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'Monitor', 'defaultController' => 'Site', // preloading 'log' component 'preload'=>array('log'), // using Yii::app()->params['paramName'] 'params'=>array( 'urlService' => WS_URI, 'ambiente' => ENVIRONMENT, ), ));
Puesta en marcha.
El último punto es remplazar el proceso de identificación del ambiente de ejecución utilizando el subdominio por la constante WS_URI.
Probar el servicio de Login.
La primera prueba es remplazar el uso del subdominio para identificar la url del WebService de login a utilizar.
// compartido/components/LoginWsjx class LoginWsjx extends CUserIdentity { protected $_allowed; public $urlService; /** * Prepara el servicio para consultar uno_wsj_login * * @author Fidel Aquino <fidel.aquino@consucorp.com.mx> * @copyright 2014-01-25 * @access private * @return boolean */ protected function _prepare() { if(!$this->urlService){ $urlService = ''; if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) && $_SERVER['HTTP_X_FORWARDED_HOST'] != '') { $serverName = $_SERVER['HTTP_X_FORWARDED_HOST']; } elseif ($_SERVER['HTTP_HOST'] != '') { $serverName = $_SERVER['HTTP_HOST']; } if (preg_match('/desenv./', $serverName)) { $urlService = 'http://desenv.sistemauno.com/ws/'; } elseif (preg_match('/homol./', $serverName)) { $urlService = 'https://homol.sistemauno.com/ws/'; } else { $urlService = 'https://www.sistemauno.com/source/ws/'; } $this->urlService = $urlService; } if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '') { $this->_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif ($_SERVER['REMOTE_ADDR'] != '') { $this->_ip = $_SERVER['REMOTE_ADDR']; } else { $this->_ip = CHttpRequest::getUserHostAddress(); } $_ips = explode(',', $this->_ip); if (sizeof($_ips) > 1) { $this->_ip = $_ips[0]; } return true; }
El componente LoginWsjx ahora puede recibir la url a la que debe consultar el servicio de login, la identificación del ambiente se mantiene por compatibilidad.
Para indicar la url al componente es necesario incluir esta propiedad en la clase LoginForm.
// protected/models/LoginForm.php class LoginForm extends CFormModel { public $username; public $password; public $rememberMe; public $urlService; public function authenticate($attribute,$params) { if (!$this->hasErrors()) { $this->_identity=new LoginWsjx($this->username, $this->password); // indicar la url a LoginWsjx $this->_identity->urlService = $this->urlService; if (!$this->_identity->authenticate()) { if ($this->_identity->errorCode == LoginWsjx::ERROR_NOT_ALLOWED) { $this->addError('password', Traductor::t('No cuenta con los permisos para acceder a la aplicación')); } else { $this->addError('password', Traductor::t('El usuario o la contraseña son incorrectos')); } } } } public function login() { if ($this->_identity===null) { $this->_identity=new LoginWsjx($this->username, $this->password); // indicar la url a LoginWsjx $this->_identity->urlService = $this->urlService; $this->_identity->authenticate(); } if ($this->_identity->errorCode===LoginWsjx::ERROR_NONE) { $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days Yii::app()->user->login($this->_identity, $duration); return true; } else { return false; } }
Finalmente en el controllador responsable de validar el login asignar a LoginForm la url a utilizar.
// protected/controllers/SiteControoler.php public function actionLogin() { if (!Yii::app()->user->isGuest) { $this->redirect(Yii::app()->user->returnUrl); } $this->layout='//layouts/no_layout'; $model=new LoginForm; $model->urlService = Yii::app()->params['urlService'];
EOF!