Laravel y yo!

La ultima vez que escribí, comente que estaba comenzando una etapa nueva donde tendría que reencontrarme con PHP como lenguaje de programación. Ha pasado ya mas de 10 meses de ese rencuentro y no ha sido tan difícil como pensaba.

¿A qué me refiero con difícil? Entenderán que estuve trabajando con Python por un tiempo, y que me sentí, ( todavía me siento ) enamorado de Django. Lo que pudiera hacer difícil esa transición a PHP, ya que cosas tan bellas como Python y Django se extrañan con facilidad.

Resulta que me encuentro con un entorno de PHP que ha evolucionado y madurado bastante, el lenguaje como tal ha ido limpiando su mala imagen con una mejor y mas clara API, se han implementado avances que ya se encontraban en otros lenguajes, cosas como Closures, Traits, Generators, namespaces, etc. Ademas como comunidad se ha avanzado en la creación de herramientas y estándares que ayudan a que desarrollar en PHP sea mas civilizado.

Tomo como ejemplo Composer. Es una herramienta de manejo de dependencias, los que han usado pip en Python o maven en Java, conocerán las ventajas de usar una herramienta como esta. La comunidad de Symfony ha creado una gran base de componentes de altísima calidad que permite crear aplicaciones robustas en PHP.

Comencé un proyecto nuevo con un grupo de excompañeros de trabajo, el cual, decidimos realizar en PHP ya que la mayoría de los compañeros no manejaban con comodidad otro lenguaje y mientras menos tiempo pasáramos aprendiendo algo nuevo mejor. Yo como arquitecto de este proyecto propuse usar Laravel, ya que luego de haber trabajado con CakePHP y haber evaluado otros frameworks, encontré que Laravel posee la mayoría de los elementos que que me harían disfrutar desarrollar en PHP y que no me dolería tanto no estar trabajando en Django.

A continuación te mostraré porque me gusta Laravel:

Rutas (routing):

A diferencia a muchos frameworks para PHP donde las rutas estan atadas al controlador y los metodos del controlador, en la Laravel las rutas se declaran en un archivo de rutas. Esto nos permite especificar la ruta independientemente del controlador que vaya a recibir el request. Podemos tener rutas totalmente restful si asi lo queremos, o llamarlas como mejor se adapte a nuestras necesidades. Tambien nos permite responder a una petición a esa ruta sin necesidad de implementar un controlador. Te doy unos ejemplos:

Route::get('/', function () {
    return 'Hola Mundo';
});

Fácil y sencilla, si solicitamos la raiz de nuestro sitio respondemos ‘Hola Mundo’, no tuvimos que crear ninguna clase de controlador ni metodos que representen acciones, solo pasamos un Closure. Por supuesto en aplicaciones mas reales necesitamos responder con un controlador

Route::get('cantantes/{ id }', [
    'as' => 'perfil', 
    'uses' => 'UsuarioController@muestraPerfil'
]);

Aquí una petición get al recurso de la colección cantantes identificado por id, es identificada como perfil, laravel toma el request y se lo da a el método llamado muestraPerfil del controlador UsuarioController. Laravel automáticamente inyecta el id a muestraPerfil si así se necesita.

Puedes ver mas en routing.

Eloquent:

Laravel posee un ORM llamado Eloquent el cual es una implementación de ActiveRecord donde cada Modelo representa una tabla en la base de datos. El usuario interactua con la base de datos a través de estos modelos. Cabe destacar que, como la mayoría de los ORM, Eloquent es agnóstico del motor de base de datos que se este usando. Por defecto posee soporte para los siguientes motores de base de datos:

  • Sqlite
  • Mysql
  • Postgresql
  • SQL Server

Un ejemplo de interacción con un modelo de Eloquente sería:

$cantante = App\Cantante::find(1);

$cantante->name = 'Juan de los Santos Contreras';

$cantante->save();

Obtenemos el cantante con el id 1, indicamos el nombre y luego lo guardamos en la base de datos. También podemos utilizar los métodos del QueryBuilder, lo que nos permite realizar queries de la siguiente manera:

App\Cantante::where('active', 1)
          ->where('estilo', 'Salsa')
          ->update(['bailable' => true]);

Puedes ver mas en Eloquent.

Laravel viene con baterías incluidas. Ya por defecto posee registro/autenticación de usuarios, Migraciones de base de datos, biblioteca de colas (queue), cache, eventos, trabajos (jobs), logging, abstracción de File System, localization, abstracción para enviar correos, facilidades para realizar pruebas unitarias, etc.

Una de esas baterías que me encantan son los Collections, es como arrays de PHP pero con esteroides. Te doy unos ejemplos:

Imagínate que tenemos un arreglo de cantantes,

$cantantes = [
  ['nombre' => 'Juan de los Santos Contreras',
  'estilo' => 'Llanera',
  'bailable' => true],
  ['nombre' => 'Tito Rojas',
  'estilo' => 'Salsa',
  'bailable' => true],
  ['nombre' => 'Mozart',
  'estilo' => 'Clasica',
  'bailable' => false],
];

y necesito aquellos cantantes que cantan música bailable, para esto usamos filter:

$c = Illuminate\Support\Collection::make($cantantes);

$bailables = $c->filter(function($item){ 
    return $item['bailable']; 
});

var_dump($bailables);

class Illuminate\Support\Collection#709 (1) {
protected $items =>
  array(2) {
    [0] =>
    array(3) {
      'nombre' =>
      string(28) "Juan de los Santos Contreras"
      'estilo' =>
      string(7) "Llanera"
      'bailable' =>
      bool(true)
    }
    [1] =>
    array(3) {
      'nombre' =>
      string(10) "Tito Rojas"
      'estilo' =>
      string(5) "Salsa"
      'bailable' =>
      bool(true)
    }
  }
}

Podemos también encadenar los llamados a los métodos de Collection ya que devuelven una instancia de Collection.

$bailables = $c->filter(function($item){ 
                 return $item['bailable'];
               })->map(function($item){ 
                 return strtoupper($item['nombre']);  
               });

var_dump($bailables);

class Illuminate\Support\Collection#696 (1) {
  protected $items =>
  array(2) {
    [0] =>
    string(28) "JUAN DE LOS SANTOS CONTRERAS"
    [1] =>
    string(10) "TITO ROJAS"
  }
}

Puedes ver mas en Collections

¿Quieres hacer una prueba de integración?

Tan fácil como esto:

public function testVerCantantes()
{
    $this->visit('/')
         ->click('Ver Cantantes')
         ->seePageIs('/cantantes')
         ->see('Listado de Cantantes');
}

Cuando ejecutes PHPUnit y se ejecute este test, Laravel interactua como si fuese un browser, abre la pagina inicial del sitio, hace click en el link que diga ‘Ver Cantantes’, valida que te ha llevado a la pagina ‘/cantantes’ y tambien valida que esa pagina muestra ‘Listado de Cantantes’. Mas cool que eso no puede ser.

Puedes ver mas en Testing.

Esto es solo alguna de las cosas por lo cual me siento tan agradado con Laravel. Si eres o estas pensando en desarrollar en PHP te recomiendo al menos pruebes Laravel.

Trataré de escribir mas sobre mis experiencias con Laravel.

You may also like...

  • gilberto

    Hola Miguel tienes una direccion de correo para contacto ?

    • Hola Gilberto, disculpa que no haya respondido antes. miguel at miguelmendez punto com punto ve