Archivos de Categoría: PHP - Paginas 3

Primeras pruebas con el framework Slim

De vez en cuando me gusta echar un vistazo a otros frameworks a parte de mi querido Laravel, y esta vez me ha dado por probar Slim y la verdad que me ha sorprendido de lo facilito que parece al menos para crear una API Restful, luego habría que ver qué tal se da para desarrollar una web entera.

Lo primero es crear el proyecto de Slim con la base:

composer create-project slim/slim-skeleton prueba

Con esto tenemos la estructura básica por lo que tendremos que prepararla para que se pueda conectar a la base de datos, para ello primero configuramos los datos de conexión a la base de datos en el fichero src/settings.php:

// Database connection settings
"db" => [
   'driver' => 'mysql',
   'host' => '127.0.0.1',
   'database' => 'prueba',
   'username' => 'user',
   'password' => 'pass',
   'collation' => 'utf8_general_ci',
   'charset' => 'utf8',
   'prefix' => ''
],

Y añadimos Eloquent al proyecto:

composer require illuminate/database

Después en el fichero de public/index.php añadiremos las siguientes líneas $app->run(); que aparece al final:

/* instanciar eloquent */
$container = $app->getContainer();
$dbSettings = $container->get('settings')['db'];
$capsule = new Illuminate\Database\Capsule\Manager;
$capsule->addConnection($dbSettings);
$capsule->bootEloquent();
$capsule->setAsGlobal();

En este caso vamos a conectarnos a una tabla con la siguiente estructura (netemos datos de prueba ya que estamos):

CREATE TABLE `tareas` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`tarea` VARCHAR(250) NOT NULL,
`estado` ENUM('Pendiente','Finalizada') NOT NULL DEFAULT 'Pendiente',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
INSERT INTO `tareas` (`id`, `tarea`, `estado`) VALUES
(1, 'La primera', 'Pendiente'),
(2, 'La segunda', 'Finalizada'),
(3, 'La tercera', 'Finalizada'),
(4, 'La cuarta',  'Pendiente');

Podríamos usar consultas a pelo en el fichero src/routes.php pero vamos a usar modelos de datos, para ello primero nos creamos una carpeta app/models:

$ mkdir -p app/models

Y en el fichero composer.json habilitamos el PSR-4 para que haga el autoload de las clases:

"autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },

El siguiente paso sería crear el modelo de datos que es bastante sencillito, creamos el fichero app/models/Tarea.php:

namespace App\Models;

class Pedido extends \Illuminate\Database\Eloquent\Model {

}

Pero para que tenga efecto tendremos que actualizar el composer (tendremos que ejecutarlo cada vez que creemos un modelo):

composer dump-autoload --optimize

Y ya por ultimo solo quedaría preparar las rutas en el fichero src/routes.php, en este caso voy a crear la ruta /api/tareas para que devuelva el listado de todas las tareas y /api/tarea/{id} para que cargue una tarea en concreto:

use Slim\Http\Request;
use Slim\Http\Response;
use App\Models\Tarea;


$app->group('/api', function() use ($app) {
    $app->get('/tareas', function ($request, $response, $args) {
        $todos = Tarea::all();
        return $this->response->withJson($todos);
    });

    $app->get('/tarea/[{id}]', function ($request, $response, $args) {
        $todo = Tarea::find($args['id']);
        return $this->response->withJson($todo);
    });
});

Status code 419 con llamadas de Ajax desde Laravel

Estoy montando una aplicación con la última versión de Laravel y al hacer una llamada de Ajax por POST me devuelve un error 419. Si añadía la página como excepción en el middleware VerifyCsrfToken si funcionaba así que corriendo a comprobar si al hacer la llamada pasaba el parámetro _token, y si, lo estaba pasando. Googleando he encontrado una solución bastante sencilla, en el header de la página plantamos el siguiente meta:

<meta name="csrf-token" content="{{ csrf_token() }}">

Y luego el siguiente javascript (siempre que usemos jQuery) para que modifique la cabecera de las peticiones AJAX:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

Encriptando datos al guardarlos en base de datos con Laravel 5

He tenido que preparar un proceso de pago y para ello teníamos que guardar el número de cuenta IBAN en base de datos. Lógicamente este dato es delicado por lo que mejor guardarlo encriptado. Para ello en la base de datos lo guardaremos como varchar(255).

Luego vamos a necesitar el uso de un trait, para ello crearemos el fichero app\Traits\Encryptable.php:

namespace Aplicacion\Traits;
use Crypt;
trait Encryptable
{
    public function getAttribute($key)
    {
        $value = parent::getAttribute($key);
        if (in_array($key, $this->encryptable)) {
            $value = Crypt::decrypt($value);
        }
        return $value;
    }

    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->encryptable)) {
            $value = Crypt::encrypt($value);
        }
        return parent::setAttribute($key, $value);
    }
}

Luego lo integramos en el modelo:

namespace Aplicacion;
use Illuminate\Database\Eloquent\Model;
use Aplicacion\Traits\Encryptable;

class Registro extends Model {
  use Encryptable;
  protected $table = 'registros';
  protected $fillable = ['razon_social', 'cif', 'email', 'iban'];
// indicamos los campos que van a guardarse encriptados
  protected $encryptable = ['iban'];
}

Ya podre usar el modelo como cualquier otro sin necesidad de preocuparnos por la encriptación