Manejo de Errores en Laravel

Aún cuando Laravel trae preconfigurado el manejo de errores, encontrarás que algunas aplicaciones necesitan ser personalizadas a los requerimientos del sistema.

Primeramente hablemos de la configuración, en el archivo config/app.php encontramos que la variable APP_DEBUG controla cuanto debe ser el detalle de los mensajes de errores. Por ello, se define que para entornos de desarrollo la variable debe ser true, y para los casos de producción debe ser false.

Ahora bien, todas la excepciones en Laravel son manejadas por la clase App\Exceptions\Handler. Esta clase contiene dos metodos: report y render.

Report

El método report es útil cuando necesitamos loguear los errores a sistemas externos. Por ejemplo, a un servidor remoto syslog. Por defecto, el método report simplemente pasa la clase base de una Excepción. Así, podríamos enviar diferente notificaciones a diferentes logs de la siguiente forma. Asimismo, podríamos guardar en el log de Laravel cualquier excepción.

/**
 * Report or log an exception.
 *
 * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
 *
 * @param  \Exception  $e
 * @return void
 */
public function report(Exception $e)
{
    if ($e instanceof CustomException) {
        //
    }

    return parent::report($e);
}

Render

Este método es el responsable de convertir una excepción en una respuesta HTTP que pudiera ser enviada al navegador. Por defecto, se recibe la excepción base, sin embargo, existe la libertad de enviar a cualquier vista, como se desee.

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    if ($e instanceof CustomException) {
        return response()->view('errors.custom', [], 500);
    }

    return parent::render($request, $e);
}

Por otro lado, si se quiere aún mas personalización, se pueden crear vistas HTML para los diferentes códigos de estado HTTP. Es decir, si queremos singularizar los errores 404, creamos un archivo en la ruta resources/views/errors/404.blade.php. Este archivo reemplazará todos los errores 404 generados en la aplicación.

Logging

Laravel provee una capa simple para acceder a la librería Monolog. De allí que podamos escribir en el log usando el facade Log.

<?php

namespace App\Http\Controllers;

use Log;
use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        Log::info('Showing user profile for user: '.$id);

        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

Con ello, pudiéramos integrar el uso de log para la captura de errores pudieran no ser vistos por el usuario en el navegador. Supongamos, que no se encuentra el perfil por el id, allí tendríamos un error de aplicación. Aquí podemos captura el error y agregarlo al log, de la siguiente forma

<?php

namespace App\Http\Controllers;

use Log;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        try {
            return view('user.profile', ['user' => User::findOrFail($id)]);
        catch (ModelNotFoundException $e) {       
            Log::error('User not found with id '.$id);
        }

        return view('user.index');
    }
}

Así, el usuario no se enteraría del error, y los administrador pudieran estar monitoreando el log para posibles errores.

Accesors y Mutators en Laravel

Los “accesors” y “mutators” en Laravel son de mucha utilidad. Nos ayudan al momento de presentar ó guarda los datos, dándole el formato que necesitamos. Los “accessor” son un método de implimentar los “getters” y los “mutators” son la forma de implementar los “setters”.

Supongamos, necesitamos que el nombre de una compañía siempre se muestre en mayúsculas. Para ello, creamos un método llamado getNameAttribute() en el modelo Bussiness. El “accessor” será llamado automáticamente cuando Eloquent trate de recibir el atributo “name”.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Bussiness extends Model
{
    /**
     * Get the namee.
     *
     * @param  string  $value
     * @return string
     */
    public function getNameAttribute($value)
    {
        return strtoupper($value);
    }
}

Como se observa, el valor original se pasa al “accesor”, permitiendo la manipulación, es este caso, convertirlo a mayúsculas. Así cuando se acceda al attributo “name”, Eloquent llama al accessor y se obtiene el valor en mayusculas.

$bussiness = App\Bussiness::find(1);

$name = $user->name;

Mailtrap, la herramienta para el desarrollo de emails

mailtrap

Recientemente hemos buscado notificar de ciertos eventos vía email en el desarrollo de aplicaciones. Para efectos de testing, enviar los correos al log era suficiente para orroborar que estuviera funcionando.

Luego, surgió la necesidad de darle formato con CSS, para mejorar la presentación de las notificaciones. Como la aplicación estará enviando esos mensajes a una cuenta email, que en este caso no es monitoreada por el desarrollador, la pruebas se vuelve tediosas.

Es aquí cuando Mailtrap puede ayudar. Mailtrap es un servidor de correos de pruebas, que permite notificaciones email sin la necesidad de ser enviada  a los usuarios reales de la aplicación.

No solo basta con la capacidad de envío, lo que la hace una poderosa herramienta, se le añade su utilidad para ver los emails de prueba online, reenviar como un email ordinario y compartirlo.

Para ponerlo en funcionamiento, debes registrarte en el sitio Mailtrap y configurar PHP para que utilize las credenciales que se otorgan. En Laravel la configuración puede ser añadida en el archivo .env, por ejemplo

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=some
MAIL_PASSWORD=password
MAIL_FROM=from@example.com
MAIL_FROM_NAME=Example

 

airMAX

airMAX es una tecnología propietaria de Ubiquiti Networks.  Basada en el procotocolo TDMA y soportada por el estandar 802.11, que a diferencia de este último, ha sido diseñada para usado en exteriores, resolviendo el problema del nodo oculto.

Entre los beneficios del airMAX podemos hablar de la escalibilidad al resolver los problemas de conexiones en exteriores. Baja latencias, dando prioridad a los paquetes de voz y video, así como prioridad sobre las conexiones activas sobre las desocupdas.  Y por último, la velocidad, actualmente podemos hablar de conexiones MIMO con tasas sobre los 150Mbps reales en una configuración PtP.

La nueva generación de AirMax (airMAX ac), ha mejorado dramáticamente la latencia TDMA y la escalabilidad de la redes PtMP. Ubiquiti Networks ha desarrollado su propio hardware que les permite acelerar el procesamiento, logrando el soporte para altas tasas de transferencias y a modulaciones más densas, obteniendo así altos rendimientos.