Kohana: quelque astuces concernant l'ORM
J'ai déjà couvert, dans un article précédent, les bases de l'ORM. Un autre article viendra pour traiter les relations avec la librairie ORM. Le présent article présente quelque astuces sympathiques pour faciliter certains traitements avec l'ORM au travers d'exemples simples. Alors au menu:
- Surcharge de la méthode __get() afin de faire des traitements sur les attributs d'un objet récupéré de la base
- Surcharge de la méthode __set() afin de faire des traitements sur les attributs d'un objet avant de l'insérer en base
- Présentation d'une fonction permettant de tester l'existence de l'élément dans la base
- Présentation d'une fonction permettant d'initialiser un objet ORM plus rapidement
Certains des exemples de cet article sont issus de la section learn de Kohana.
Surcharge de la méthode __get()
Exemple de traitement sur des dates
Dans l'introduction l'exemple portait sur la gestion d'articles au travers du modèle Article_Model. Supposons que la table décrivant un article possède un champs date de modification (modified) et un autre date de création (created), tous deux de type datetime. Vous pouvez adapter la méthode save() pour qu'elle mette à jour le champs modified. De même vous pouvez mettre à jour le champs created dans la méthode insert().
De plus vous souhaitez récupérer cette date et l'avoir en timestamp de façon à faire des traitements dessus dans votre application. Il faudrait donc, a chaque requête de lecture, faire un appel à strtotime() pour une conversion de MySQL à PHP. Mais il y a la possibilité de le faire automatiquement en surchargeant la méthode __get() de l'ORM:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Article_Model extends ORM{ public function __get($key) { if($key=='modified' || $key=='created') { if (isset($this->object->$key)) { return strtotime($this->object->$key); } } return parent::__get($key); } } |
Ainsi, a chaque requête de récupération d'article, la date sera convertie en timestamp php.
Exemple de traitement d'objets contenus en base
Un autre usage de cette technique est lorsque vous stockez des objets ou tableaux dans votre base de données (qu'elle qu'en soit la raison
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public function __get($key) { if($key=='userobject' ) { if (isset($this->object->$key)) { return unserialize($this->object->$key); } } return parent::__get($key); } public function __set($key, $value) { if($key=='userobject') { $value=serialize($value); } return parent::__set($key,$value); } |
De cette façon, vous pouvez ajouter des objets dans votre base sans vous préoccuper des problématiques de sérialisation.
Surcharge de la méthode __set()
Imaginons que vous souhaitez que le titre de votre article soit inséré en base en minuscule excepté la première lettre. Rien de plus simple:
1 2 3 4 5 6 7 8 9 10 | public function __set( $key, $value ) { if( $key === 'title') { // Ensure the title is formatted correctly $value = ucwords(strtolower($value)); } parent::__set( $key, $value ); } |
Autre exemple, la hachage d'un mot de passe peut être fait dans le __set(). Cela permet de garder le contrôleur propre sans tous ces traitements.
Test d'existence d'un élément
Une méthode utile est le test d'existence d'un élément tel que dans notre exemple tester si un article existe. Créer un fichier application/libraries/MY_ORM.php. Pour rappel, un fichier préfixé MY_objet permet d'étendre l'objet (donc une librairie, un contrôleur, un modèle, …).
Utilisation:
Chargement facilité de valeurs dans l'ORM de Kohana
La méthode suivante permet d'initialiser les attributs d'un objet ORM de manière plus facilitée. Un exemple d'utilisation est un un formulaire d'ajout d'un article par exemple. Une fois les données validées, cette méthode peut être appelée pour initialiser les valeurs de l'objet article en une seule ligne. Bien sûr cela exige quand même que les noms de vos champs dans le formulaire soient les noms des colonnes en base. De même que l'exemple précédent il faut mettre la fonction dans le fichier application/libraries/MY_ORM.php:
class ORM extends ORM_Core { public function load_values($data) { foreach ($data as $field=>$value) { if(array_key_exists($field,self::$fields[$this->table])) { $this->$field=$value; } } } }
Utilisation:
// on suppose que les valeurs du formulaire sont dans $form if($form->validate()) { $article=new Article_Model; //instance d'ORM $article->load_values($form); $article->save(); //initialisera $article->title à la valeur du champs title du formulaire }
dlib Says:
Salut,
Which wordpress extension do you use for syntax highlighting? I am looking around for a new skin for the learning kohana blog and more fancy syntax highlighting would also be nice.
Thanx,
Posted on avril 11th, 2008 at 12:08
hotandspicy Says:
I'm using WP-Syntax (same for you, duh?) except I added some css to have background, border and line numbers if needed. CSS can be found in http://www.hotandspicy.fr/wp-content/themes/personal/style-typography.css under wp_syntax class.
To enable line number, use this syntax: <pre lang="php" line="1">
Hope this helps
Posted on avril 11th, 2008 at 14:29