Migration

Pour les utilisateurs de la première version de Temma qui souhaitent passer à la v2, voici quelques points à prendre en compte.


1Contrôleurs : création & nommage

Les contrôleurs doivent hériter de l'objet \Temma\Web\Controller et non plus \Temma\Controller.

Les noms des objets contrôleurs n'ont plus besoin d'avoir le suffixe Controller.
Les noms des méthodes d'action n'ont plus besoin d'avoir le préfixe exec.

La méthode d'initialisation des contrôleurs doit s'appeler __wakeup() et non plus init().
La méthode de finalisation des contrôleurs doit s'appeler __sleep() et non plus finalize().

L'action racine doit s'appeler __invoke() et non plus index().
L'action proxy doit s'appeler __proxy() et non plus proxy().

Le nom du fichier de template correspondant à l'action racine devient donc __invoke.tpl, et non plus index.tpl.

Les méthodes utilitaires des contrôleurs prennent maintenant un underscore au début de leur nom, pour éviter toute ambiguïté avec les noms des actions :

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

2Vues : nommage

Les noms des objets gérant les vues n'ont plus le suffix "View".

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

3Plugins : création

Les plugins doivent hériter de l'objet \Temma\Web\Plugin et non plus \Temma\Controller.

Les plugins peuvent toujours avoir :

  • Soit une méthode plugin(), qui sera systématiquement appelée, que l'objet soit utilisé en pré-plugin aussi bien qu'en post-plugin.
  • Soit une méthode preplugin() et/ou une méthode postplugin(), qui seront appelées suivant que l'objet est utilisé en pré-plugin et/ou en post-plugin.

Notez bien que l'objet \Temma\Web\Plugin hérite lui-même de \Temma\Web\Controller, ce qui fait que les plugins sont toujours des contrôleurs avec des capacités en plus. Donc un plugin peut avoir des actions en plus de ses méthodes pré-/post-plugin.


4Contrôleurs & plugins : Variables de template

Pour écrire ou lire dans une variable de template, on écrivait :

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

Maintenant il faut écrire :

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

Il y a des changements similaires pour la gestion des sessions et du cache.


5Contrôleurs : Sucre syntaxique

Auparavant, quand on voulait faire une redirection puis arrêter tous les traitements (plugins et contrôleur), on écrivait :

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

Maintenant on peut écrire :

return $this->_redirect($url);

6Composant d'injection de dépendances

Un objet centralise les instances des objets manipulés. Il est accessible par l'attribut _loader des contrôleurs.

Par exemple, pour accéder à l'objet contenant la configuration :

$this->_loader->config

Vous pouvez faire en sorte que vos propres objets soient gérés par le composant (voir la documentation). Cela vous permet ensuite d'utiliser les objets sans vous soucier de leur instanciation.
Par exemple :

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

7SQL : quote() et quoteNull()

Si vous écrivez vos requêtes SQL vous-mêmes, vous échappez les paramètres avec la méthode quote(). Par exemple :

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

La méthode quote() retourne toujours une chaîne entourée d'apostrophes. Ainsi elle convertira la chaîne L'article en 'L\'article'. Et elle convertira une chaîne vide (ainsi que la valeur null) en ''.

Auparavant, la méthode quote() n'ajoutait pas d'apostrophes au début et à la fin de la chaîne traitée. Il fallait donc les ajouter dans la requête SQL. Ce n'est plus nécessaire.

La méthode quoteNull() fait la même chose, sauf que si on lui donne une chaîne vide (ou nulle) en paramètre, elle retourne la chaîne NULL (sans apostrophes).

Cela peut être utile lorsqu'un champ accepte des valeurs nulles, et que l'on veut gérer cela.

Dans cet exemple, le champ text vaudra NULL si la variable $content est vide :

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

8SQL : Requêtes préparées

Il est maintenant possible d'utiliser des requêtes préparées (voir la documentation).