Blog
Yii2, un framework de PHP (I)

admin /26 junio, 2016

Yii2

Yii es un framework PHP de alto rendimiento para el desarrollo rápido de aplicaciones Web 2.0. Yii cuenta con características avanzadas: MVC, DAO / ActiveRecord, I18N / L10N, almacenamiento en caché, autenticación y control de acceso basado en roles, con entorno de pruebas, etc y que tiene como objetivo poder reducir significativamente el tiempo de desarrollo.

Hace ya cuatro años que comencé a utilizar Yii, un framework entonces casi desconocido de PHP. Tras intentar enseñar a mi alumnado Symfony y CodeIgniter, descubrí este framework que entonces estaba en su versión 1.0 y que era fácil de aprender, además contaba con unos estupendos vídeo tutoriales de Gustavo Salgado en Youtube. Gracias a esto conseguí el objetivo: el alumnado supo que era un framework con Modelo Vista Controlador y la utilización de un ORM en poco más de un mes. Me gustó mucho, aunque tampoco le di más valor que el puramente académico.

El nacimiento de Yii2

La llegada al mundo de Yii2 hizo que tuviera que remplatearme la situación. Me encontré con una herramienta que consideré excelente para el desarrollo de software, pero que contaba con poca documentación de calidad, sobre todo en español. Así que tocó ponerse a estudiar el material que había en la red. Lo primera que variaba era la creación de un proyecto, podíamos elegir entre la plantilla básica y la avanzada. Lo primero que llamaba la atención era la adopción de Composer como manejador de dependencias. Si queremos crear un proyecto con la plantilla básica sólo debemos teclear desde la línea de comandos

composer create-project --prefer-dist yiisoft/yii2-app-basic basic

Una vez descargado el proyecto podemos revisar si cumplimos con los requisitos abriendo en nuestro navegador en la url http://urldetuservidor/basic/requirements.php. Si deseamos ver la página inicial de la web deberíamos ir a http://urldetuservidor/basic/web/. Es conveniente la configuración del archivo hosts (si estamos trabajando en local) o del fichero .htaccess para poder trabajar con una url del tipo http://urldetuservidor

 

Si, como es de esperar, nuestra aplicación va a estar conectada a uApp básica de Yii2na base de datos, los datos de dicha conexión se introducirán en el archivo de configuración ubicado en basic/config/web.php, ahí también se encuentra el atributo cookieValidationKey, al que hay que darle un valor cualquiera.

La nueva estructura

En la anterior versión todos los componentes del proyecto (modelos, vistas, controladores, framework y las librerías de terceros) se encontraban dentro de la carpeta protected, que ya no existe, y se  muestra una estructura de directorios como la siguiente:

– assets
– commands
– config
– controller
– mail
– models
– runtime
– test
– vendor
– views
– web

El directorio vendor contiene las librerías externas y el propio framework y su manejo se realiza mediante la herramienta Composer.  Además, Yii2 se ha convertido en un framework totalmente orientado a objetos, que hace uso de algunas de las características más avanzadas de PHP, incluyendo el enlace estático en tiempo de ejecución, la biblioteca estándar de funciones SPL y las funciones anónimas. Por si el cambio fuera pequeño, todas las clases son de espacios de nombres, lo que le permite tomar ventaja de su cargador automático ahora mediante el uso de namespaces. Ya no se cargan todas las clases automáticamente como se hacía anteriormente y es necesario sentencias de este tipo:

use yii\helpers\Html;

 

Hay que reconocer que resulta al principio engorroso tener que aprenderse donde se encuentran localizadas las clases habitualmente usadas y hay que hacer uso en numerosas ocasiones del amigo Google para dicha función, pero el tiempo de aprendizaje no es mucho.

El nuevo ActiveRecord

Si hay algo que ha mejorado y hace que sea muy fácil su uso y sea muy potente es la clase ActiveRecord, que hace que las consultas sean fáciles de construir y fácil de entender cuando uno consulta un código ajeno.

$amigos = Users::find()
    ->where(['es_amigo' => true])
    ->orderBy('id')
    ->all();

Por otro lado, las relaciones también han modificado y con los métodos getters que hay que implentar hacen que se se comporten como si fuera un atributo más de la clase del modelo. Veamos un ejemplo

//Si tengo una relación uno a muchos, en la que un Autor puede escribir muchos posts, pero un post sólo es escrito por un usuario, en el
//modelo Autor debería añadir este get, donde indico que id_autor es la clave foránea correspondiente a Autor.id
public function getPosts()
{
  return $this->hasMany(Posts::className(), ['id_autor' => 'id']);
}
 
//Lo mismo sucede con la clase Comentarios, pero como en este caso es una relación muchos a muchos tengo que indicar mediante el
//uso de via(), a la que se pasa como parámetro la clase/tabla donde se almacena la relación
public function getComentarios()
{
  return $this->hasMany(Comentarios::className(), ['id' => 'id_post'])->via('Posts');
}
 

public function getComentarios()
{
  return $this->hasMany(Comentarios::className(), ['id' => 'id_post'])
  ->viaTable(Posts::className(), ['id_autor' => 'id']);
}
 
//De este modo, la consulta de los posts y comentarios de un autor sería así de fácil
$autor= Authors::findOne(['nombre_completo' => 'Juan García']);
$posts = $autor->posts;
$comentarios = $autor->comentarios;

 

Este manejo de las relaciones y su posterior uso para  hacer consultas, dota a Yii2 de una gran potencia y lo hace realmente recomendable, a la vez que fácil. Si anteriormente usé este framework simplemente con fines académicos, a partir de la versión 2 pasó a ser mi framework PHP  de cabecera para el desarrollo de aplicaciones web.