0

De objetos a BD y viceversa

Laravel incluye una herramienta de mapeo objeto-relacional (ORM) llamado Eloquent, que permite usar el patrón Active Record. El patrón Active Record es una técnica para dar a bases de datos una capa de orientación a objetos. De este modo se puede presentar una tabla como una clase, y una fila como un objeto. El mundo Java tiene otros ORM como Hibernate (una implementación de la Java Persistence API).

Para que Eloquent pueda crear una clase a partir de una tabla, ésta debe tener una columna autoincremental (id) y las columnas created_at y updated_at, que se crean con el método timestamps() en el modelo de Illuminate. Por ejemplo, el modelo de Eloquent correspondiente a la tabla animals se define en el fichero app/models/Animal.php, y es tan sencillo como:

class Animal extends Eloquent
{

}

Con esto ya podemos crear objetos, establecer sus atributos y guardarlos en la base de datos fácilmente:
$a = new Animal;
$a->name = "Toby";
...
$a->save();

Así mismo podemos buscar el registro con un determinado ID:
$a = Animal::find(1)
y editarlo o borrarlo:
$a->delete()
ó
Animal::destroy(1)

Al no necesitar usar sentencias SQL, el código queda mucho más claro y limpio.

0

Modelo de datos inicial

Ésta es la estructura que he pensado inicialmente para la base de datos. De momento sólo están las tablas necesarias para lo más básico (los datos de los animales de la protectora). Posteriormente añadiré más tablas para más funcionalidades. Aún así, es muy probable que estas tablas sufran cambios hasta llegar a la versión 1.0.

esquema
Laravel utiliza PDO, por lo que puede funcionar con diversos sistemas de gestión de bases de datos, incluyendo MySQL, PostgreSQL y SQLite. En mi caso voy a utilizar una base de datos MySQL, que ya he creado. Para configurar Laravel para que la utilice, se edita el fichero app/config/database.php.

Observo que ya está puesto que use MySQL por omisión

'default' => 'mysql',

así que sólo hay que suministrar los datos de conexión

'mysql' => array(
'driver'    => 'mysql',
'host'      => 'localhost',
'database'  => 'androcles',
'username'  => 'quique',
'password'  => 'topsecret',
'charset'   => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix'    => '',
),

Ahora hay que crear la estructura de la base de datos. Laravel incluye una clase, Schema, que permite manipular tablas en diversos RDBMS. También incluye Migrations, unos scripts en PHP que permiten construir o modificar la base de datos guardando un registro de los cambios.
Quiero definir una tabla para almacenar los datos de los animales de la protectora. Para ello ejecuto

php artisan migrate:make create_animals --create=animals

que crea el fichero app/database/migrations/2014_03_13_135630_create_animals.php. Este fichero contiene dos métodos: up() y down(). En up() se indica lo que queremos hacer (por ejemplo crear una tabla con ciertas columnas) y en down() cómo deshacerlo. Por ejemplo:

public function up()
{
    Schema::create('animals', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name');
        $table->integer('species_id')->unsigned();
        $table->foreign('species_id')->references('id')->on('species');
        $table->integer('sex_id');
        $table->string('breed');
        $table->date('dateofbirth');
        $table->date('datebroughtin');
        $table->date('dateofexit');
        $table->text('comments');
        $table->boolean('neutered');
        $table->integer('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->integer('coat_id')->unsigned();
        $table->foreign('coat_id')->references('id')->on('coats');
        $table->integer('status_id')->unsigned();
        $table->foreign('status_id')->references('id')->on('status');
        $table->string('youtube');
        $table->string('provenance');
        $table->string('deliverer');
        $table->string('size');
        $table->string('weight');
        $table->string('chipcode');
        $table->text('vaccinations');
        $table->text('diseases');
        $table->text('surgeries');
        $table->text('treatment');
        $table->text('privatecomments');
        $table->timestamps();
    });
}

public function down()
{
    Schema::drop('animals');
}

Una vez creada la plantilla podemos ejecutar

php artisan migrate

que ejecuta los metodos up() de todas las migraciones, si todavía no se habían ejecutado. La orden

php artisan migrate --pretend

nos dice qué es lo que se ejecutará al ejecutar la migración.

php artisan migrate:rollback

deshace la última migración, y

php artisan migrate:reset

deshace todas las migraciones.

2

Instalación de Laravel 4 en GNU/Linux

Para poder empezar a programar (o usar) Androcles, lo primero que hay que hacer es instalar el framework Laravel 4.  He probado las explicaciones que siguen a continuación en Debian 7.4 (Wheezy) y en Ubuntu Server 12.04 (Precise Pangolin). En otras distribuciones debería ser igual o muy parecido.

Obviamente deberemos tener un entorno LAMP funcionando (Linux + Apache + MySQL + PHP). Laravel requiere PHP >= 5.3.7, y además el paquete php5-mcrypt (así como php5-json y php5-curl si no estuvieran ya instalados). Con la orden php -m podemos ver los módulos de PHP habilitados, con php5enmod y php5dismod habilitarlos o inhabilitarlos a voluntad.

También usaremos git como sistema de gestión de versiones, y composer para gestionar dependencias en PHP.

Composer

composer viene a ser un reemplazo actualizado y mejorado de PEAR. Para instalarlo simplemente ejecutamos esta línea:
curl -sS https://getcomposer.org/installer | php

En el directorio en el que nos encontrábamos aparece el fichero composer.phar.  Para facilitarnos la vida lo renombramos y movemos:
# mv composer.phar /usr/local/bin/composer

Cuando queramos (o necesitemos) actualizar composer simplemente tendremos que ejecutar
# composer self-update

Laravel

Hay dos (o tres) maneras de instalar Laravel:

  1. Usando el instalador.
    Descargamos el instalador, que podemos renombrar y mover como hemos hecho con composer:
    wget http://laravel.com/laravel.phar
    chmod a+x laravel.phar
    # mv laravel.phar /usr/local/bin/laravel

    Para crear un nuevo proyecto de Laravel simplemente ejecutamos
    laravel new mi-proyecto
    que creará un directorio con una instalación de Laravel y todas sus dependencias.
  2. Usando composer.
    Para crear un proyecto ejecutamos:
    composer create-project laravel/laravel /ruta/al/proyecto --prefer-dist
  3. Mediante descarga (como un tarball o usando git).

Configuración

En el fichero app/config/app.php de nuestro proyecto podemos cambiar el idioma y el huso horario:
'timezone' => 'Europe/Madrid',
'locale' => 'es',

El servidor web necesita permisos de escritura sobre los directorios que hay en app/storage:
# chown -R quique:www-data app/storage/*
chmod -R g+w app/storage/*

Servidor web

En un entorno de desarrollo, como puede ser mi portátil, puede ser suficiente usar el miniservidor web que incluye PHP 5.4 y posterior:
php artisan serve --port 8080

En un servidor real, probablemente usaremos Apache. Necesitamos habilitar el módulo mod_rewrite. Podemos crear el enlace simbólico en /etc/apache2/mods-enabled con
# a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restart

Normalmente configuraremos un VirtualHost en el que el DocumentRoot sea la carpeta public de nuestro proyecto, y con la opción
AllowOverride All .

Con esto ya se puede ir a http://localhost en el navegador y comprobar que Laravel está instalado correctamente. Para nuestra comodidad también podemos usar en nuestro VirtualHost la opción
ServerName mi-proyecto.dev
y poner en el fichero etc/hosts la línea
127.0.0.1   mi-proyecto.dev

2

Cómo aprender Laravel

A pesar de ser relativamente joven, Laravel cuenta con una cantidad sorprendentemente alta de recursos para aprender.

En vez de esperar a aprender Laravel por completo antes de ponerme a programar, mi idea es escribir Androcles a la vez que aprendo Laravel (learning by doing). En este blog iré comentando mis progresos y dificultades.

Imagen

El inconveniente de este enfoque es que en más de una ocasión tendré que deshacer cosas para volver a hacerlas mejor. Aunque esto pueda parecer una pérdida de tiempo, creo que los resultados merecerán la pena.

Imagen

Recursos gratuitos

Vídeos

Libros y e-books

He empezado por Learning Laravel, que es gratuito y se ajusta bien a mi forma de aprender. Una lástima que esté sin acabar, pero al menos es útil para tener una visión global de cómo desarrollar una aplicación con Laravel. A continuación tal vez lea Code Bright, que parece tener buenas críticas.