Reporte de errores a Correo
Buenas tardes a todos
Continuando con la construcción de nuestro sitio web con Yii Framework, vamos a ver un tema muy importante para asegurarnos que nuestro servicio esté el mayor tiempo posible cumpliendo con sus objetivos, y que cualquier error que tengamos podamos rastrearlo. Para esto tenemos que tomar en cuenta que nuestro sistema puede tener fallas si no se realizaron las pruebas necesarias, y que no podemos dejar que los usuarios vean la vista de debug que el framework trae por default ya que no genera confianza y además les permite ver cosas que no deben de ver.
Para esto tenemos que modificar en nuestro sistema operando en producción el archivo index.php que se encuentra en la raíz de nuestro proyecto similar a lo que se apunta a continuación:
</pre> </div> <div><?php</div> <div></div> <div>// change the following paths if necessary</div> <div>$yii=dirname(__FILE__).'/../../../opt/yii-1.1.14.f0fee9/framework/yii.php';</div> <div>$config=dirname(__FILE__).'/protected/config/main.php';</div> <div></div> <div>// remove the following lines when in production mode</div> <div>//defined('YII_DEBUG') or define('YII_DEBUG',true);</div> <div>// specify how many levels of call stack should be shown in each log message</div> <div>//defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);</div> <div></div> <div>require_once($yii);</div> <div>Yii::createWebApplication($config)->run();</div> <div> <pre>
Comentando esas dos lineas, desactivamos la vista de debug, pero nos falta que en la vista de nuestro sistema no aparezca el código y descripción del error, información que es útil para el debug pero no para los usuarios de nuestro sitio, así que en protected/views/site/error, cambiamos el siguiente código:
</pre> </div> <div><h2>Error <?php echo $code; ?></h2></div> <div></div> <div><div class="error"></div> <div><?php echo CHtml::encode($message); ?></div> <div></div></div> <div> <pre>
por:
</pre> </div> <div><h2>Ha ocurrido un problema</h2></div> <div></div> <div><div class="error"></div> <div>Es posible que los datos ingresados no sean correctos, favor de verificarlos y de persistir el problema comunicarse con el área correspondiente</div> <div></div></div> <div> <pre>
Con esto, ya no le mostraríamos errores a nuestros usuarios, pero aun tenemos el problema de que nadie del staff que desarrolla el proyecto se enteraría de que hay un problema con el funcionamiento, así que modificaremos nuestro protected/controller/SiteController.php para que nos haga un envió de la información del error:
</pre> </div> <div><?php</div> <div></div> <div>public function actionError() {</div> <div> if ($error = Yii::app()->errorHandler->error) {</div> <div> if ($error["code"] != 404 && $error["code"] != 403) {</div> <div> $content = "";</div> <div> foreach ($error as $key => $item) {</div> <div> if ($key == "traces") {</div> <div> $content.= "$key: ";</div> <div> $content.= json_encode($item);</div> <div> $content.= "<br />";</div> <div> } else {</div> <div> $content.= "$key: $item<br />";</div> <div> }</div> <div> }</div> <div> //echo $content;</div> <div> $remitente="<a href="mailto:prueba@prueba.com" target="_blank">prueba@prueba.com</a>"</div> <div>funcion_enviar_correo($remitente, $body);</div> <div> }</div> <div> if (Yii::app()->request->isAjaxRequest)</div> <div> echo $error['message'];</div> <div> else</div> <div> $this->render('error', $error);</div> <div> }</div> <div>}</div> <div> <pre>
Lo que hacemos en esta función es que recibimos el error que se presentó, si es error de no encontrado o no autorizado no enviamos ningún correo ya que no debería ser necesario, y si es otro error lo ponemos en texto plano y lo enviamos a través de cualquier función de correo que a ustedes les convenga.
Esto suele ser de mucha utilidad para darte cuenta de errores sin darlo a notar con los usuarios del sistema, así que es muy recomendable. Espero les sea muy útil y sigan programando agilmente.
Felices Códigos