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).