martes, 18 de noviembre de 2014

Actualizando Yii desde la versión 1 (Parte II)

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)

No hay comentarios.:

Publicar un comentario

Nota: sólo los miembros de este blog pueden publicar comentarios.