Migración

Para los usuarios de la primera versión de Temma que deseen actualizar a la v2, aquí tienes algunos puntos a tener en cuenta.


1Controladores: creación y nomenclatura

Los controladores deben heredar del objeto \Temma\Web\Controller y no de \Temma\Controller.

Los nombres de los objetos controladores ya no necesitan tener el sufijo Controller.
Los nombres de los métodos de acción ya no necesitan tener el prefijo exec.

El método de inicialización del controlador debe llamarse __wakeup() y no init().
El método de finalización de los controladores debe llamarse __sleep() y no finalize().

La acción raíz debe llamarse __invoke() y ya no index().
La acción proxy debe llamarse __proxy() y ya no proxy().

El nombre del archivo de plantilla correspondiente a la acción raíz pasa por tanto a ser __invoke.tpl, y ya no index.tpl.

Los métodos utilitarios de los controladores llevan ahora un guion bajo al principio de su nombre, para evitar cualquier ambigüedad con los nombres de las acciones:

  • $this->template() se convierte en $this->_template()
  • $this->redirect() se convierte en $this->_redirect()
  • $this->redirect301() se convierte en $this->_redirect301()
  • $this->httpError() se convierte en $this->_httpError()
  • $this->httpCode() se convierte en $this->_httpCode()
  • $this->getHttpError() se convierte en $this->_getHttpError()
  • $this->getHttpCode() se convierte en $this->_getHttpCode()
  • $this->view() se convierte en $this->_view()
  • $this->templatePrefix() se convierte en $this->_templatePrefix()
  • $this->subProcess() se convierte en $this->_subProcess()

2Vistas: nomenclatura

Los nombres de los objetos que gestionan las vistas ya no tienen el sufijo "View".

  • \Temma\Views\SmartyView se convierte en \Temma\Views\Smarty
  • \Temma\Views\JsonView se convierte en \Temma\Views\Json
  • \Temma\Views\CsvView se convierte en \Temma\Views\Csv
  • \Temma\Views\RssView se convierte en \Temma\Views\Rss
  • \Temma\Views\IniView se convierte en \Temma\Views\Ini
  • \Temma\Views\ICalView se convierte en \Temma\Views\ICal

3Plugins: creación

Los plugins deben heredar del objeto \Temma\Web\Plugin y no de \Temma\Controller.

Los plugins todavía pueden tener:

  • Ya sea un método plugin(), que se llamará sistemáticamente cuando se use el objeto (tanto como pre-plugin como post-plugin);
  • o un método preplugin() y/o un método postplugin(), que se llamarán según si el objeto se usa como pre-plugin y/o como post-plugin.

Ten en cuenta que el objeto \Temma\Web\Plugin hereda de \Temma\Web\Controller, por lo que los plugins son siempre controladores con capacidades adicionales. Así, un plugin puede tener acciones además de sus métodos de pre-/post-plugin.


4Controladores y plugins: Variables de plantilla

Para escribir o leer una variable de plantilla, escribíamos:

$this->set('variable', $value);
$value = $this->get('variable');

Ahora hay que escribir:

$this['variable'] = $value;
$value = $this['variable'];

Hay cambios similares para la gestión de las sesiones y de la caché.


5Controladores: Azúcar sintáctico

Antes, cuando queríamos hacer una redirección y luego detener todo el procesamiento (plugins y controlador), escribíamos:

$this->redirect($url);
return self::EXEC_HALT;

Ahora podemos escribir:

return $this->_redirect($url);

6Componente de inyección de dependencias

Un objeto centraliza las instancias de los objetos gestionados. Es accesible mediante el atributo _loader de los controladores.

Por ejemplo, para acceder al objeto que contiene la configuración:

$this->_loader->config

Puedes hacer que tus propios objetos sean gestionados por el componente (ver la documentación). Esto te permite entonces usar los objetos sin preocuparte por su instanciación.
Por ejemplo:

$this->_loader->UserGateway->deleteUser($userId);

7SQL: quote() y quoteNull()

Si escribes tus propias consultas SQL, escapas los parámetros con el método quote(). Por ejemplo:

$sql = "SELECT *
        FROM users
        WHERE email = " . $db->quote($email) . "
        LIMIT 1";

El método quote() siempre devuelve una cadena rodeada de apóstrofes. Así, convertirá la cadena O'Higgins en 'O\'Higgins'. Y convertirá una cadena vacía (así como el valor null) en ''.

Antes, el método quote() no añadía apóstrofes al principio y al final de la cadena procesada. Por lo tanto, había que añadirlos en la consulta SQL. Ya no es necesario.

El método quoteNull() hace lo mismo, salvo que si le damos una cadena vacía (o null) como parámetro, devuelve la cadena NULL (sin apóstrofes).

Esto puede ser útil cuando un campo acepta valores nulos, y queremos gestionar eso.

En este ejemplo, el campo text se establecerá en NULL si la variable $content está vacía:

$sql = "INSERT INTO ARTICLE
        SET title = " . $db->quote($title) . ",
            text = " . $db->quoteNull($content);

8SQL: Peticiones preparadas

Ahora es posible usar consultas preparadas (ver la documentación).