Migration

Para usuários da primeira versão do Temma que desejam migrar para a v2, aqui estão alguns pontos a considerar.


1Controladores: criação e nomenclatura

Os controladores devem herdar do objeto \Temma\Web\Controller e não mais de \Temma\Controller.

Os nomes dos objetos controladores não precisam mais ter o sufixo Controller.
Os nomes dos métodos de ação não precisam mais ter o prefixo exec.

O método de inicialização do controlador deve se chamar __wakeup() e não mais init().
O método de finalização dos controladores deve se chamar __sleep() e não mais finalize().

A ação raiz deve se chamar __invoke() e não mais index().
A ação proxy deve se chamar __proxy() e não mais proxy().

O nome do arquivo de template correspondente à ação raiz passa então a ser __invoke.tpl, e não mais index.tpl.

Os métodos utilitários dos controladores agora recebem um underscore no início do nome, para evitar qualquer ambiguidade com os nomes das ações:

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

2Visões: nomenclatura

Os nomes dos objetos que gerenciam as visões não têm mais o sufixo "View".

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

3Plugins: criação

Os plugins devem herdar do objeto \Temma\Web\Plugin e não mais de \Temma\Controller.

Os plugins ainda podem ter:

  • Um método plugin(), que será chamado sistematicamente quando o objeto for usado (tanto como pré-plugin quanto como pós-plugin);
  • ou um método preplugin() e/ou um método postplugin(), que serão chamados dependendo se o objeto é usado como pré-plugin e/ou pós-plugin.

Observe que o objeto \Temma\Web\Plugin herda de \Temma\Web\Controller, então os plugins são sempre controladores com capacidades adicionais. Assim, um plugin pode ter ações além de seus métodos pré-/pós-plugin.


4Controladores e plugins: variáveis de template

Para escrever ou ler em uma variável de template, escrevíamos:

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

Agora é preciso escrever:

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

Há mudanças semelhantes para o gerenciamento de sessões e cache.


5Controladores: açúcar sintático

Anteriormente, quando queríamos fazer um redirecionamento e depois interromper todo o processamento (plugins e controlador), escrevíamos:

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

Agora podemos escrever:

return $this->_redirect($url);

6Componente de injeção de dependências

Um objeto centraliza as instâncias dos objetos manipulados. Ele é acessível por meio do atributo _loader dos controladores.

Por exemplo, para acessar o objeto que contém a configuração:

$this->_loader->config

Você pode garantir que seus próprios objetos sejam gerenciados pelo componente (veja a documentação). Isso permite então usar os objetos sem se preocupar com sua instanciação.
Por exemplo:

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

7SQL: quote() e quoteNull()

Se você mesmo escreve suas consultas SQL, você escapa os parâmetros com o método quote(). Por exemplo:

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

O método quote() sempre retorna uma string cercada por apóstrofos. Assim, ele converterá a string copo d'água em 'copo d\'água'. E converterá uma string vazia (assim como o valor null) em ''.

Anteriormente, o método quote() não adicionava apóstrofos no início e no fim da string processada. Por isso, era necessário adicioná-los na consulta SQL. Isso não é mais necessário.

O método quoteNull() faz a mesma coisa, exceto que, se fornecermos a ele uma string vazia (ou null) como parâmetro, ele retorna a string NULL (sem apóstrofos).

Isso pode ser útil quando um campo aceita valores nulos, e queremos tratar isso.

Neste exemplo, o campo text será definido como NULL se a variável $content estiver vazia:

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

8SQL: consultas preparadas

Agora é possível usar consultas preparadas (veja a documentação).