Como habíamos mencionado anteriormente, las diferencias entre las versiones 1 y 2 son algunas, ya que la versión 2 ha sido totalmente reescrita. Así que actualizar desde la versión 1 no es algo trivial. Continuando con las diferencias tenemos:
Aplicaciones de Consola
Las aplicaciones de consola ahora están organizadas como controladores, como una aplicación web. Los controladores de consola se extienden
yii\console\Controller, similar a
CConsoleCommand de la versión 1.
Para ejecutar un comando de consola se utiliza
yii <route>, where
<route> es la ruta de un controlador (ejemplo: sitemap/index)
I18N
Yii 2 deja de lado todo el formato de fechas y números incorporados en favor del paquete
PECL intl PHP.
La traducción de mensajes ahora se realiza a través del componente i18n. Este componente administra un conjunto de mensajes fuente, que permite usar diferentes mensajes distribuidos en categorías.
Filtros de Acción
Los filtros de acción (
los filtros que definíamos en el controlador), ahora se implementan a través de los comportamientos (
behaviors). Para definir uno nuevo, se extiende de yii\base\ActionFilter. Por ejemplo, para utilizar el filtro yii\filters\AccessControl se debe escribir el siguiente código en un controlador.
public function behaviors()
{
return [
'access' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
['allow' => true, 'actions' => ['admin'], 'roles' => ['@']],
],
],
];
}
Assets
Yii 2 introduce un nuevo concepto llamado
asset bundle que reemplaza el concepto de paquetes de script de la versión 1.
Un
asset bundle es un conjunto de archivos (por ejemplo: archivos JavaScript, hojas de estilo CSS, imágenes) dentro de un directorio. Cada
asset bundle se representa como una clase que se extiende de
yii\web\AssetBundle. Se registra vía
yii\web\AssetBundle::register().
Helpers
Yii 2 introduce algunas de las clases helper (asistentes) comúnmente utilizadas, incluyendo:
- yii\helpers\Html
- yii\helpers\ArrayHelper
- yii\helpers\StringHelper
- yii\helpers\FileHelper
- yii\helpers\Json
Formularios
Yii 2 introduce el concepto de
field (campo) para construir un formulario utilizando
yii\widgets\ActiveForm. Un
field es un contenedor compuesto de una etiqueta, una entrada, un mensaje de error y/o un texto de indicio (
hint). Un formulario se puede construir más limpiamente, algo similar a:
<?php $form = yii\widgets\ActiveForm::begin(); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<div class="form-group">
<?= Html::submitButton('Login') ?>
</div>
<?php yii\widgets\ActiveForm::end(); ?>
Query Builder (Constructor de Consultas)
En la versión 1 utilizábamos una serie de clases para construir nuestras sentencias, que incluía el uso de
CDbCommand,
CDbCriteria, y
CDbCommandBuilder. Yii 2 representa una consulta en términos de un objeto
Query. Por ejemplo:
$query = new \yii\db\Query();
$query->select('id, name')
->from('user')
->limit(10);
$command = $query->createCommand();
$sql = $command->sql;
$rows = $command->queryAll();
Active Record (Registro Activo)
Yii 2 introduce muchos cambios a nivel del Registro Activo. Los más obvios es el
Query Builder y el manejo de consultas relacionadas. En la versión 1 la clase utilizada era
CDbCriteria. En ésta nueva versión se utiliza
yii\db\ActiveQuery la cual es una extensión de
yii\db\Query. Una consulta sería:
$customers = Customer::find()
->where(['status' => $active])
->orderBy('id')
->all();
Para declarar una relación, se define un método que retorne un objeto tipo
ActiveQuery . Por ejemplo:
class Customer extends \yii\db\ActiveRecord{
public function getOrders()
{
return $this->hasMany('Order', ['customer_id' => 'id']);
}
}
De esta manera se puede utilizar
$customer->orders para acceder a las órdenes de compra de un cliente. También se puede usar el siguiente código para realizar una consulta relacionada condicionada:
$orders = $customer->getOrders()->andWhere('status=1')->all();
En general, la manera de ejecutar las consultas no es muy diferente, aunque en Yii 2 se optimiza la manera de obtener los resultados con el fin de reducir significativamente el tiempo de CPU y la memoria, especialmente con una gran cantidad de registros, como por ejemplo al ejecutar:
$customers = Customer::find()->asArray()->all();
Otro cambio es que no se puede definir un valor por defecto de los atributos a través de las propiedades públicas. Para poder realizar ésto, se lo debe hacer en el método init.
public function init()
{
parent::init();
$this->status = self::STATUS_NEW;
}
Algunos problemas de la versión 1 al sobreescribir el constructor ya no se encuentran en la versión 2. Otros cambios y mejoras se las verá en entradas posteriores.
Active Record Behaviors (Comportamiento del Registro Activo)
La clase
CActiveRecordBehavior ha sido eliminada en la versión 2. Para crear un
Active Record Behavior, hay que extenderlo directamente de
yii\base\Behavior. Si el
behavior necesita responder a un evento en particular, hay que sobreescribir el método
events(). Por ejemplo:
namespace app\components;
use yii\db\ActiveRecord;
use yii\base\Behavior;
class MyBehavior extends Behavior{
// ...
public function events()
{
return [
ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
];
}
public function beforeValidate($event)
{
// ...
}
}
Usuarios e Interfaces de Identidad
La clase
CWebUser utilizada en la versión 1, es reemplazada por
yii\web\User, y ya no hay la clase CUserIdentity. Ahora se debe implementar
yii\web\IdentityInterface que es mucho más sencillo de usar. Las plantillas proveen un ejemplo, aunque conforme avancemos en la revisión de ésta versión, en las entradas se irá viendo acerca de Autentificación, Autorización y Técnicas de Aplicaciones Avanzadas.
Administración de URL
El administrador de URLs de la versión 2 es similar al de la versión 1. Una mejora es que ahora soporta parámetros. Por ejemplo, se puede tener una regla que hace coincidir post/popular con post/1/popular. En la versión 1 se requiere de dos reglas para este objetivo, mientras que en la nueva versión quedaría algo como lo siguiente:
[
'pattern' => 'post/<page:\d+>/<tag>',
'route' => 'post/index',
'defaults' => ['page' => 1],
]
También te puede interesar:
Actualizando Yii desde la versión 1 (Parte I)